summaryrefslogtreecommitdiff
path: root/src/daemon/dlt_daemon_socket.c
diff options
context:
space:
mode:
authorbaduras <baduras@gmail.com>2018-01-12 12:21:07 +0100
committerChristoph Lipka <clipka@users.noreply.github.com>2018-01-12 12:21:07 +0100
commitf355ad238fb769c295e5820eb9af6a56a7afa593 (patch)
tree126d28f1f431c0e90d9eeb8f74dbbab42ebe35de /src/daemon/dlt_daemon_socket.c
parent166e6e17523051f03f79616d511a9f59d613ab97 (diff)
downloadDLT-daemon-f355ad238fb769c295e5820eb9af6a56a7afa593.tar.gz
Prevention for occasional corrupted messages (#26)
Prevention for occasional corrupted messages caused mostly due to system high load.
Diffstat (limited to 'src/daemon/dlt_daemon_socket.c')
-rw-r--r--src/daemon/dlt_daemon_socket.c46
1 files changed, 37 insertions, 9 deletions
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;
}