From f355ad238fb769c295e5820eb9af6a56a7afa593 Mon Sep 17 00:00:00 2001 From: baduras Date: Fri, 12 Jan 2018 12:21:07 +0100 Subject: Prevention for occasional corrupted messages (#26) Prevention for occasional corrupted messages caused mostly due to system high load. --- src/daemon/dlt_daemon_socket.c | 46 +++++++++++++++++++++++++++++++++--------- 1 file changed, 37 insertions(+), 9 deletions(-) (limited to 'src/daemon/dlt_daemon_socket.c') diff --git a/src/daemon/dlt_daemon_socket.c b/src/daemon/dlt_daemon_socket.c index 686f4d6..098537f 100644 --- a/src/daemon/dlt_daemon_socket.c +++ b/src/daemon/dlt_daemon_socket.c @@ -145,26 +145,54 @@ int dlt_daemon_socket_close(int sock) int dlt_daemon_socket_send(int sock,void* data1,int size1,void* data2,int size2,char serialheader) { /* Optional: Send serial header, if requested */ + int ret = DLT_RETURN_OK; if (serialheader) { - if ( 0 > send(sock, dltSerialHeader,sizeof(dltSerialHeader),0) ) - return DLT_DAEMON_ERROR_SEND_FAILED; - + ret = dlt_daemon_socket_sendreliable(sock, (void *) dltSerialHeader, sizeof(dltSerialHeader)); + if(ret != DLT_RETURN_OK) + return ret; } /* Send data */ - if(data1 && size1>0) + if(data1 != NULL && size1 > 0) { - if (0 > send(sock, data1,size1,0)) - return DLT_DAEMON_ERROR_SEND_FAILED; + ret = dlt_daemon_socket_sendreliable(sock, data1, size1); + if(ret != DLT_RETURN_OK) + return ret; } - if(data2 && size2>0) + if(data2 != NULL && size2 > 0) { - if (0 > send(sock, data2,size2,0)) - return DLT_DAEMON_ERROR_SEND_FAILED; + ret = dlt_daemon_socket_sendreliable(sock, data2, size2); + if(ret != DLT_RETURN_OK) + return ret; } + return ret; +} + +int dlt_daemon_socket_sendreliable(int sock, void* buffer,int message_size) +{ + int data_sent = 0; + + while (data_sent < message_size) + { + ssize_t ret = send(sock, buffer + data_sent, message_size - data_sent, 0); + if (ret < 0) + { + if (errno==EINTR || errno==EAGAIN || errno==EWOULDBLOCK) + { + // Temporary error. + dlt_vlog(LOG_INFO,"dlt_daemon_socket_sendreliable: socket sending failed [errno: %d], trying again.\n", errno); + } + else + { + dlt_vlog(LOG_WARNING,"dlt_daemon_socket_sendreliable: socket send failed [errno: %d]!\n", errno); + return DLT_DAEMON_ERROR_SEND_FAILED; + } + } + data_sent += ret; + } return DLT_DAEMON_ERROR_OK; } -- cgit v1.2.1