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

pull/147/head
Michael Zillgith 7 years ago
parent 445dfe2667
commit 8141f1e891

@ -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);

@ -119,17 +119,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 */
@ -236,7 +249,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);
@ -283,10 +296,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);
if (sock != -1) {
self = (Socket) GLOBAL_MALLOC(sizeof(struct sSocket));
self->fd = sock;
self->connectTimeout = 5000; self->connectTimeout = 5000;
}
else {
if (DEBUG_SOCKET)
printf("SOCKET: failed to create socket (errno=%i)\n", errno);
}
return self; return self;
} }
@ -305,13 +328,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);

@ -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);
if (sock != INVALID_SOCKET) {
self = (Socket) GLOBAL_MALLOC(sizeof(struct sSocket));
self->fd = sock;
self->connectTimeout = 5000; self->connectTimeout = 5000;
socketCount++; socketCount++;
}
else {
if (DEBUG_SOCKET)
printf("SOCKET: failed to create socket (error code=%i)\n", WSAGetLastError());
}
return self; return self;
} }
@ -330,8 +340,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;
@ -744,7 +744,7 @@ parseGooseMessage(GooseReceiver self, int numbytes)
printf("GOOSE_SUBSCRIBER: APDU length: %i\n", apduLength); printf("GOOSE_SUBSCRIBER: APDU length: %i\n", apduLength);
} }
// check if there is an interested subscriber /* check if there is an interested subscriber */
LinkedList element = LinkedList_getNext(self->subscriberList); LinkedList element = LinkedList_getNext(self->subscriberList);
while (element != NULL) { while (element != NULL) {
@ -792,7 +792,7 @@ gooseReceiverLoop(void* threadParameter)
} }
#endif #endif
// start GOOSE receiver in a separate thread /* start GOOSE receiver in a separate thread */
void void
GooseReceiver_start(GooseReceiver self) GooseReceiver_start(GooseReceiver self)
{ {
@ -879,7 +879,7 @@ GooseReceiver_stopThreadless(GooseReceiver self)
self->running = false; self->running = false;
} }
// call after reception of ethernet frame /* call after reception of ethernet frame */
bool bool
GooseReceiver_tick(GooseReceiver self) GooseReceiver_tick(GooseReceiver self)
{ {

@ -287,6 +287,9 @@ IsoClientConnection_associate(IsoClientConnection self, IsoConnectionParameters
{ {
self->socket = TcpSocket_create(); self->socket = TcpSocket_create();
if (self->socket == NULL)
goto exit_error;
Socket_setConnectTimeout(self->socket, connectTimeoutInMs); Socket_setConnectTimeout(self->socket, connectTimeoutInMs);
#if (CONFIG_ACTIVATE_TCP_KEEPALIVE == 1) #if (CONFIG_ACTIVATE_TCP_KEEPALIVE == 1)
@ -297,7 +300,7 @@ IsoClientConnection_associate(IsoClientConnection self, IsoConnectionParameters
#endif #endif
if (!Socket_connect(self->socket, params->hostname, params->tcpPort)) if (!Socket_connect(self->socket, params->hostname, params->tcpPort))
goto returnError; goto exit_error;
/* COTP (ISO transport) handshake */ /* COTP (ISO transport) handshake */
CotpConnection_init(self->cotpConnection, self->socket, self->receiveBuffer, self->cotpReadBuffer, self->cotpWriteBuffer); CotpConnection_init(self->cotpConnection, self->socket, self->receiveBuffer, self->cotpReadBuffer, self->cotpWriteBuffer);
@ -315,7 +318,7 @@ IsoClientConnection_associate(IsoClientConnection self, IsoConnectionParameters
if (DEBUG_ISO_CLIENT) if (DEBUG_ISO_CLIENT)
printf("TLS handshake failed!\n"); printf("TLS handshake failed!\n");
goto returnError; goto exit_error;
} }
} }
#endif /* (CONFIG_MMS_SUPPORT_TLS == 1) */ #endif /* (CONFIG_MMS_SUPPORT_TLS == 1) */
@ -336,12 +339,12 @@ IsoClientConnection_associate(IsoClientConnection self, IsoConnectionParameters
} }
if (packetState != TPKT_PACKET_COMPLETE) if (packetState != TPKT_PACKET_COMPLETE)
goto returnError; goto exit_error;
cotpIndication = CotpConnection_parseIncomingMessage(self->cotpConnection); cotpIndication = CotpConnection_parseIncomingMessage(self->cotpConnection);
if (cotpIndication != COTP_CONNECT_INDICATION) if (cotpIndication != COTP_CONNECT_INDICATION)
goto returnError; goto exit_error;
/* Upper layers handshake */ /* Upper layers handshake */
struct sBufferChain sAcsePayload; struct sBufferChain sAcsePayload;
@ -393,7 +396,7 @@ IsoClientConnection_associate(IsoClientConnection self, IsoConnectionParameters
cotpIndication = CotpConnection_parseIncomingMessage(self->cotpConnection); cotpIndication = CotpConnection_parseIncomingMessage(self->cotpConnection);
if (cotpIndication != COTP_DATA_INDICATION) if (cotpIndication != COTP_DATA_INDICATION)
goto returnError; goto exit_error;
IsoSessionIndication sessionIndication; IsoSessionIndication sessionIndication;
@ -403,13 +406,13 @@ IsoClientConnection_associate(IsoClientConnection self, IsoConnectionParameters
if (sessionIndication != SESSION_CONNECT) { if (sessionIndication != SESSION_CONNECT) {
if (DEBUG_ISO_CLIENT) if (DEBUG_ISO_CLIENT)
printf("IsoClientConnection_associate: no session connect indication\n"); printf("IsoClientConnection_associate: no session connect indication\n");
goto returnError; goto exit_error;
} }
if (!IsoPresentation_parseAcceptMessage(self->presentation, IsoSession_getUserData(self->session))) { if (!IsoPresentation_parseAcceptMessage(self->presentation, IsoSession_getUserData(self->session))) {
if (DEBUG_ISO_CLIENT) if (DEBUG_ISO_CLIENT)
printf("IsoClientConnection_associate: no presentation ok indication\n"); printf("IsoClientConnection_associate: no presentation ok indication\n");
goto returnError; goto exit_error;
} }
AcseIndication acseIndication; AcseIndication acseIndication;
@ -419,7 +422,7 @@ IsoClientConnection_associate(IsoClientConnection self, IsoConnectionParameters
if (acseIndication != ACSE_ASSOCIATE) { if (acseIndication != ACSE_ASSOCIATE) {
if (DEBUG_ISO_CLIENT) if (DEBUG_ISO_CLIENT)
printf("IsoClientConnection_associate: no ACSE_ASSOCIATE indication\n"); printf("IsoClientConnection_associate: no ACSE_ASSOCIATE indication\n");
goto returnError; goto exit_error;
} }
ByteBuffer_wrap(self->receivePayloadBuffer, self->acseConnection.userDataBuffer, ByteBuffer_wrap(self->receivePayloadBuffer, self->acseConnection.userDataBuffer,
@ -446,7 +449,7 @@ IsoClientConnection_associate(IsoClientConnection self, IsoConnectionParameters
return; return;
returnError: exit_error:
self->callback(ISO_IND_ASSOCIATION_FAILED, self->callbackParameter, NULL); self->callback(ISO_IND_ASSOCIATION_FAILED, self->callbackParameter, NULL);
setState(self, STATE_ERROR); setState(self, STATE_ERROR);

Loading…
Cancel
Save