WSAEvent fixes ported from realjiangms pull 2870.

This commit is contained in:
Armin Novak
2015-09-05 15:18:01 +02:00
parent 188fe4ed2b
commit 7d8ab23877
4 changed files with 17 additions and 19 deletions

View File

@@ -171,8 +171,13 @@ static BOOL freerdp_listener_open(freerdp_listener* instance, const char* bind_a
/* FIXME: these file descriptors do not work on Windows */
listener->sockfds[listener->num_sockfds] = sockfd;
listener->events[listener->num_sockfds] =
CreateFileDescriptorEvent(NULL, FALSE, FALSE, sockfd, WINPR_FD_READ);
listener->events[listener->num_sockfds] = WSACreateEvent();
if (!listener->events[listener->num_sockfds])
{
listener->num_sockfds = 0;
break;
}
WSAEventSelect(sockfd, listener->events[listener->num_sockfds], FD_READ | FD_ACCEPT | FD_CLOSE);
listener->num_sockfds++;
WLog_INFO(TAG, "Listening on %s:%s", addr, servname);
@@ -336,7 +341,7 @@ static BOOL freerdp_listener_check_fds(freerdp_listener* instance)
void* sin_addr;
int peer_sockfd;
freerdp_peer* client = NULL;
socklen_t peer_addr_size;
int peer_addr_size;
struct sockaddr_storage peer_addr;
rdpListener* listener = (rdpListener*) instance->listener;
static const BYTE localhost6_bytes[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 };
@@ -347,8 +352,10 @@ static BOOL freerdp_listener_check_fds(freerdp_listener* instance)
for (i = 0; i < listener->num_sockfds; i++)
{
WSAResetEvent(listener->events[i]);
peer_addr_size = sizeof(peer_addr);
peer_sockfd = accept(listener->sockfds[i], (struct sockaddr*) &peer_addr, &peer_addr_size);
peer_sockfd = _accept(listener->sockfds[i], (struct sockaddr*) &peer_addr, &peer_addr_size);
peer_accepted = FALSE;
if (peer_sockfd == -1)

View File

@@ -145,6 +145,8 @@ static int transport_bio_simple_read(BIO* bio, char* buf, int size)
BIO_clear_flags(bio, BIO_FLAGS_READ);
WSAResetEvent(ptr->hEvent);
status = _recv(ptr->socket, buf, size, 0);
if (status > 0)
@@ -365,7 +367,7 @@ static int transport_bio_simple_init(BIO* bio, SOCKET socket, int shutdown)
return 0;
/* WSAEventSelect automatically sets the socket in non-blocking mode */
if (WSAEventSelect(ptr->socket, ptr->hEvent, FD_READ | FD_WRITE | FD_CLOSE))
if (WSAEventSelect(ptr->socket, ptr->hEvent, FD_READ | FD_ACCEPT | FD_CLOSE))
{
WLog_ERR(TAG, "WSAEventSelect returned %08X", WSAGetLastError());
return 0;

View File

@@ -751,19 +751,6 @@ int transport_check_fds(rdpTransport* transport)
if (!transport)
return -1;
if (BIO_get_event(transport->frontBio, &event) != 1)
return -1;
/**
* Loop through and read all available PDUs. Since multiple
* PDUs can exist, it's important to deliver them all before
* returning. Otherwise we run the risk of having a thread
* wait for a socket to get signaled that data is available
* (which may never happen).
*/
#ifdef _WIN32
ResetEvent(event);
#endif
while(!freerdp_shall_disconnect(transport->context->instance))
{
/**

View File

@@ -630,7 +630,9 @@ BOOL WSASetEvent(HANDLE hEvent)
BOOL WSAResetEvent(HANDLE hEvent)
{
return ResetEvent(hEvent);
/* POSIX systems auto reset the socket,
* if no more data is available. */
return TRUE;
}
BOOL WSACloseEvent(HANDLE hEvent)