diff --git a/libfreerdp/core/listener.c b/libfreerdp/core/listener.c index a08c45300..262308269 100644 --- a/libfreerdp/core/listener.c +++ b/libfreerdp/core/listener.c @@ -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) diff --git a/libfreerdp/core/tcp.c b/libfreerdp/core/tcp.c index 45a500cde..58dd96d50 100644 --- a/libfreerdp/core/tcp.c +++ b/libfreerdp/core/tcp.c @@ -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; diff --git a/libfreerdp/core/transport.c b/libfreerdp/core/transport.c index 9ecdd2376..f20a5aa03 100644 --- a/libfreerdp/core/transport.c +++ b/libfreerdp/core/transport.c @@ -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)) { /** diff --git a/winpr/libwinpr/winsock/winsock.c b/winpr/libwinpr/winsock/winsock.c index b2d0238a7..ee80082a7 100644 --- a/winpr/libwinpr/winsock/winsock.c +++ b/winpr/libwinpr/winsock/winsock.c @@ -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)