- fixed client TCP keep alive problem (see #115)

pull/119/head
Michael Zillgith 7 years ago
parent 3d8ab44a49
commit 46f87a1656

@ -216,7 +216,7 @@ ServerSocket_accept(ServerSocket self)
fd = accept(self->fd, NULL, NULL ); fd = accept(self->fd, NULL, NULL );
if (fd >= 0) { if (fd >= 0) {
conSocket = TcpSocket_create(); conSocket = (Socket) GLOBAL_CALLOC(1, sizeof(struct sSocket));
conSocket->fd = fd; conSocket->fd = fd;
} }
@ -261,9 +261,20 @@ ServerSocket_destroy(ServerSocket self)
Socket Socket
TcpSocket_create() 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; return self;
} }
@ -281,13 +292,11 @@ Socket_connect(Socket self, const char* address, int port)
struct sockaddr_in serverAddress; struct sockaddr_in serverAddress;
if (DEBUG_SOCKET) if (DEBUG_SOCKET)
printf("Socket_connect: %s:%i\n", address, port); printf("SOCKET: connect: %s:%i\n", address, port);
if (!prepareServerAddress(address, port, &serverAddress)) if (!prepareServerAddress(address, port, &serverAddress))
return false; return false;
self->fd = socket(AF_INET, SOCK_STREAM, 0);
fd_set fdSet; fd_set fdSet;
FD_ZERO(&fdSet); FD_ZERO(&fdSet);
FD_SET(self->fd, &fdSet); FD_SET(self->fd, &fdSet);

@ -118,17 +118,30 @@ Socket_activateTcpKeepAlive(Socket self, int idleTime, int interval, int count)
socklen_t optlen = sizeof(optval); socklen_t optlen = sizeof(optval);
optval = 1; 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 #if defined TCP_KEEPCNT
optval = idleTime; 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; 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; 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 /* TCP_KEEPCNT */
#endif /* SO_KEEPALIVE */ #endif /* SO_KEEPALIVE */
@ -235,7 +248,7 @@ ServerSocket_accept(ServerSocket self)
fd = accept(self->fd, NULL, NULL ); fd = accept(self->fd, NULL, NULL );
if (fd >= 0) { if (fd >= 0) {
conSocket = TcpSocket_create(); conSocket = (Socket) GLOBAL_CALLOC(1, sizeof(struct sSocket));
conSocket->fd = fd; conSocket->fd = fd;
activateTcpNoDelay(conSocket); activateTcpNoDelay(conSocket);
@ -282,10 +295,20 @@ ServerSocket_destroy(ServerSocket self)
Socket Socket
TcpSocket_create() TcpSocket_create()
{ {
Socket self = (Socket) GLOBAL_MALLOC(sizeof(struct sSocket)); Socket self = NULL;
self->fd = -1; int sock = socket(AF_INET, SOCK_STREAM, 0);
self->connectTimeout = 5000;
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; return self;
} }
@ -303,12 +326,14 @@ Socket_connectAsync(Socket self, const char* address, int port)
struct sockaddr_in serverAddress; struct sockaddr_in serverAddress;
if (DEBUG_SOCKET) if (DEBUG_SOCKET)
printf("Socket_connect: %s:%i\n", address, port); printf("SOCKET: connect: %s:%i\n", address, port);
if (!prepareServerAddress(address, port, &serverAddress)) if (!prepareServerAddress(address, port, &serverAddress))
return false; return false;
self->fd = socket(AF_INET, SOCK_STREAM, 0); fd_set fdSet;
FD_ZERO(&fdSet);
FD_SET(self->fd, &fdSet);
activateTcpNoDelay(self); activateTcpNoDelay(self);

@ -276,7 +276,7 @@ ServerSocket_accept(ServerSocket self)
fd = accept(self->fd, NULL, NULL); fd = accept(self->fd, NULL, NULL);
if (fd >= 0) { if (fd >= 0) {
conSocket = TcpSocket_create(); conSocket = (Socket) GLOBAL_CALLOC(1, sizeof(struct sSocket));
conSocket->fd = fd; conSocket->fd = fd;
setSocketNonBlocking(conSocket); setSocketNonBlocking(conSocket);
@ -303,12 +303,22 @@ ServerSocket_destroy(ServerSocket self)
Socket Socket
TcpSocket_create() TcpSocket_create()
{ {
Socket self = (Socket) GLOBAL_MALLOC(sizeof(struct sSocket)); Socket self = NULL;
self->fd = INVALID_SOCKET; int sock = socket(AF_INET, SOCK_STREAM, 0);
self->connectTimeout = 5000;
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; return self;
} }
@ -401,8 +411,6 @@ Socket_connect(Socket self, const char* address, int port)
if (!prepareServerAddress(address, port, &serverAddress)) if (!prepareServerAddress(address, port, &serverAddress))
return false; return false;
self->fd = socket(AF_INET, SOCK_STREAM, 0);
setSocketNonBlocking(self); setSocketNonBlocking(self);
fd_set fdSet; fd_set fdSet;

@ -684,7 +684,7 @@ parseGoosePayload(GooseReceiver self, uint8_t* buffer, int apduLength)
return 0; return 0;
} }
exit_with_fault: exit_with_fault:
if (DEBUG_GOOSE_SUBSCRIBER) if (DEBUG_GOOSE_SUBSCRIBER)
printf("GOOSE_SUBSCRIBER: Invalid goose payload\n"); printf("GOOSE_SUBSCRIBER: Invalid goose payload\n");
return -1; return -1;

Loading…
Cancel
Save