- updated windows socket implementation; fixed Socket_checkAsyncConnectState function

pull/375/head
Michael Zillgith 4 years ago
parent 1f2da92626
commit d40b359292

@ -445,11 +445,25 @@ Socket_checkAsyncConnectState(Socket self)
int so_error; int so_error;
int len = sizeof so_error; int len = sizeof so_error;
if (getsockopt(self->fd, SOL_SOCKET, SO_ERROR, (char*) (&so_error), &len) >= 0) { if (getsockopt(self->fd, SOL_SOCKET, SO_ERROR, (char*) (&so_error), &len) != SOCKET_ERROR) {
if (so_error == 0) {
int recvRes = recv(self->fd, NULL, 0, 0);
if (recvRes == SOCKET_ERROR) {
int wsaError = WSAGetLastError();
if (wsaError == WSAECONNRESET)
return SOCKET_STATE_FAILED;
if (wsaError == WSAECONNABORTED)
return SOCKET_STATE_FAILED;
}
if (so_error == 0)
return SOCKET_STATE_CONNECTED; return SOCKET_STATE_CONNECTED;
} }
}
return SOCKET_STATE_FAILED; return SOCKET_STATE_FAILED;
} }
@ -464,30 +478,35 @@ Socket_checkAsyncConnectState(Socket self)
bool bool
Socket_connect(Socket self, const char* address, int port) Socket_connect(Socket self, const char* address, int port)
{ {
struct sockaddr_in serverAddress; if (Socket_connectAsync(self, address, port) == false)
if (!prepareAddress(address, port, &serverAddress))
return false; return false;
setSocketNonBlocking(self); struct timeval timeout;
timeout.tv_sec = self->connectTimeout / 1000;
timeout.tv_usec = (self->connectTimeout % 1000) * 1000;
fd_set fdSet; fd_set fdSet;
FD_ZERO(&fdSet); FD_ZERO(&fdSet);
FD_SET(self->fd, &fdSet); FD_SET(self->fd, &fdSet);
if (connect(self->fd, (struct sockaddr *) &serverAddress, sizeof(serverAddress)) == SOCKET_ERROR) { if (select(self->fd + 1, NULL, &fdSet , NULL, &timeout) == 1) {
if (WSAGetLastError() != WSAEWOULDBLOCK)
return false; /* Check if connection is established */
int so_error;
socklen_t len = sizeof so_error;
if (getsockopt(self->fd, SOL_SOCKET, SO_ERROR, (char*)&so_error, &len) >= 0) {
if (so_error == 0)
return true;
}
} }
struct timeval timeout; closesocket (self->fd);
timeout.tv_sec = self->connectTimeout / 1000; self->fd = INVALID_SOCKET;
timeout.tv_usec = (self->connectTimeout % 1000) * 1000;
if (select((int)self->fd + 1, NULL, &fdSet, NULL, &timeout) <= 0)
return false; return false;
else
return true;
} }
static char* static char*

@ -2825,7 +2825,7 @@ enqueueReport(ReportControl* reportControl, bool isIntegrity, bool isGI, uint64_
#if (DEBUG_IED_SERVER == 1) #if (DEBUG_IED_SERVER == 1)
printf("IED_SERVER: REMOVE report with ID "); printf("IED_SERVER: REMOVE report with ID ");
printReportId(buffer->oldestReport); printReportId(buffer->oldestReport);
printf(" (index: %li, size: %i)\n", (void*)(buffer->oldestReport) - (void*)(buffer->memoryBlock), buffer->oldestReport->entryLength); printf(" (index: %li, size: %i)\n", (int)((uint8_t*)(buffer->oldestReport) - (uint8_t*)(buffer->memoryBlock)), buffer->oldestReport->entryLength);
#endif #endif
buffer->oldestReport = buffer->oldestReport->next; buffer->oldestReport = buffer->oldestReport->next;

Loading…
Cancel
Save