From 46f87a1656209d9123c2fb0d01d3d5eb12e96a6c Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Fri, 1 Feb 2019 15:06:14 +0100 Subject: [PATCH] - fixed client TCP keep alive problem (see #115) --- hal/socket/bsd/socket_bsd.c | 21 ++++++++++----- hal/socket/linux/socket_linux.c | 45 +++++++++++++++++++++++++-------- hal/socket/win32/socket_win32.c | 22 +++++++++++----- src/goose/goose_receiver.c | 2 +- 4 files changed, 66 insertions(+), 24 deletions(-) diff --git a/hal/socket/bsd/socket_bsd.c b/hal/socket/bsd/socket_bsd.c index 18079db7..cb5574df 100644 --- a/hal/socket/bsd/socket_bsd.c +++ b/hal/socket/bsd/socket_bsd.c @@ -216,7 +216,7 @@ ServerSocket_accept(ServerSocket self) fd = accept(self->fd, NULL, NULL ); if (fd >= 0) { - conSocket = TcpSocket_create(); + conSocket = (Socket) GLOBAL_CALLOC(1, sizeof(struct sSocket)); conSocket->fd = fd; } @@ -261,9 +261,20 @@ ServerSocket_destroy(ServerSocket self) Socket TcpSocket_create() { - Socket self = GLOBAL_MALLOC(sizeof(struct sSocket)); + Socket self = NULL; - self->fd = -1; + int sock = socket(AF_INET, SOCK_STREAM, 0); + + if (sock != -1) { + self = (Socket) GLOBAL_MALLOC(sizeof(struct sSocket)); + + self->fd = sock; + self->connectTimeout = 5000; + } + else { + if (DEBUG_SOCKET) + printf("SOCKET: failed to create socket (errno=%i)\n", errno); + } return self; } @@ -281,13 +292,11 @@ Socket_connect(Socket self, const char* address, int port) struct sockaddr_in serverAddress; if (DEBUG_SOCKET) - printf("Socket_connect: %s:%i\n", address, port); + printf("SOCKET: connect: %s:%i\n", address, port); if (!prepareServerAddress(address, port, &serverAddress)) return false; - self->fd = socket(AF_INET, SOCK_STREAM, 0); - fd_set fdSet; FD_ZERO(&fdSet); FD_SET(self->fd, &fdSet); diff --git a/hal/socket/linux/socket_linux.c b/hal/socket/linux/socket_linux.c index d6942108..2a45294a 100644 --- a/hal/socket/linux/socket_linux.c +++ b/hal/socket/linux/socket_linux.c @@ -118,17 +118,30 @@ Socket_activateTcpKeepAlive(Socket self, int idleTime, int interval, int count) socklen_t optlen = sizeof(optval); optval = 1; - setsockopt(self->fd, SOL_SOCKET, SO_KEEPALIVE, &optval, optlen); + + if (setsockopt(self->fd, SOL_SOCKET, SO_KEEPALIVE, &optval, optlen)) { + if (DEBUG_SOCKET) + printf("Failed to enable TCP keepalive\n"); + } #if defined TCP_KEEPCNT optval = idleTime; - setsockopt(self->fd, IPPROTO_TCP, TCP_KEEPIDLE, &optval, optlen); + if (setsockopt(self->fd, IPPROTO_TCP, TCP_KEEPIDLE, &optval, optlen)) { + if (DEBUG_SOCKET) + printf("Failed to set TCP keepalive TCP_KEEPIDLE parameter\n"); + } optval = interval; - setsockopt(self->fd, IPPROTO_TCP, TCP_KEEPINTVL, &optval, optlen); + if (setsockopt(self->fd, IPPROTO_TCP, TCP_KEEPINTVL, &optval, optlen)) { + if (DEBUG_SOCKET) + printf("Failed to set TCP keepalive TCP_KEEPINTVL parameter\n"); + } optval = count; - setsockopt(self->fd, IPPROTO_TCP, TCP_KEEPCNT, &optval, optlen); + if (setsockopt(self->fd, IPPROTO_TCP, TCP_KEEPCNT, &optval, optlen)) { + if (DEBUG_SOCKET) + printf("Failed to set TCP keepalive TCP_KEEPCNT parameter\n"); + } #endif /* TCP_KEEPCNT */ #endif /* SO_KEEPALIVE */ @@ -235,7 +248,7 @@ ServerSocket_accept(ServerSocket self) fd = accept(self->fd, NULL, NULL ); if (fd >= 0) { - conSocket = TcpSocket_create(); + conSocket = (Socket) GLOBAL_CALLOC(1, sizeof(struct sSocket)); conSocket->fd = fd; activateTcpNoDelay(conSocket); @@ -282,10 +295,20 @@ ServerSocket_destroy(ServerSocket self) Socket TcpSocket_create() { - Socket self = (Socket) GLOBAL_MALLOC(sizeof(struct sSocket)); + Socket self = NULL; - self->fd = -1; - self->connectTimeout = 5000; + int sock = socket(AF_INET, SOCK_STREAM, 0); + + if (sock != -1) { + self = (Socket) GLOBAL_MALLOC(sizeof(struct sSocket)); + + self->fd = sock; + self->connectTimeout = 5000; + } + else { + if (DEBUG_SOCKET) + printf("SOCKET: failed to create socket (errno=%i)\n", errno); + } return self; } @@ -303,12 +326,14 @@ Socket_connectAsync(Socket self, const char* address, int port) struct sockaddr_in serverAddress; if (DEBUG_SOCKET) - printf("Socket_connect: %s:%i\n", address, port); + printf("SOCKET: connect: %s:%i\n", address, port); if (!prepareServerAddress(address, port, &serverAddress)) return false; - self->fd = socket(AF_INET, SOCK_STREAM, 0); + fd_set fdSet; + FD_ZERO(&fdSet); + FD_SET(self->fd, &fdSet); activateTcpNoDelay(self); diff --git a/hal/socket/win32/socket_win32.c b/hal/socket/win32/socket_win32.c index 3f8f2caa..b3b8f389 100644 --- a/hal/socket/win32/socket_win32.c +++ b/hal/socket/win32/socket_win32.c @@ -276,7 +276,7 @@ ServerSocket_accept(ServerSocket self) fd = accept(self->fd, NULL, NULL); if (fd >= 0) { - conSocket = TcpSocket_create(); + conSocket = (Socket) GLOBAL_CALLOC(1, sizeof(struct sSocket)); conSocket->fd = fd; setSocketNonBlocking(conSocket); @@ -303,12 +303,22 @@ ServerSocket_destroy(ServerSocket self) Socket TcpSocket_create() { - Socket self = (Socket) GLOBAL_MALLOC(sizeof(struct sSocket)); + Socket self = NULL; - self->fd = INVALID_SOCKET; - self->connectTimeout = 5000; + int sock = socket(AF_INET, SOCK_STREAM, 0); - socketCount++; + if (sock != INVALID_SOCKET) { + self = (Socket) GLOBAL_MALLOC(sizeof(struct sSocket)); + + self->fd = sock; + self->connectTimeout = 5000; + + socketCount++; + } + else { + if (DEBUG_SOCKET) + printf("SOCKET: failed to create socket (error code=%i)\n", WSAGetLastError()); + } return self; } @@ -401,8 +411,6 @@ Socket_connect(Socket self, const char* address, int port) if (!prepareServerAddress(address, port, &serverAddress)) return false; - self->fd = socket(AF_INET, SOCK_STREAM, 0); - setSocketNonBlocking(self); fd_set fdSet; diff --git a/src/goose/goose_receiver.c b/src/goose/goose_receiver.c index 392319d3..b833e04e 100644 --- a/src/goose/goose_receiver.c +++ b/src/goose/goose_receiver.c @@ -684,7 +684,7 @@ parseGoosePayload(GooseReceiver self, uint8_t* buffer, int apduLength) return 0; } - exit_with_fault: +exit_with_fault: if (DEBUG_GOOSE_SUBSCRIBER) printf("GOOSE_SUBSCRIBER: Invalid goose payload\n"); return -1;