mirror of
https://github.com/morgan9e/FreeRDP
synced 2026-04-15 00:44:19 +09:00
WSAEvent fixes ported from realjiangms pull 2870.
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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))
|
||||
{
|
||||
/**
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user