diff --git a/UnixDgramSocket.cpp b/UnixDgramSocket.cpp index d6b73f9..3fcaca6 100644 --- a/UnixDgramSocket.cpp +++ b/UnixDgramSocket.cpp @@ -19,6 +19,9 @@ #include #include #include +#include +#include +#include #include #include #include @@ -93,22 +96,36 @@ ssize_t CUnixDgramWriter::Write(void *buf, size_t size) // open the socket int fd = socket(AF_UNIX, SOCK_DGRAM, 0); if (fd < 0) { - fprintf(stderr, "Failed to open socket %s\n", addr.sun_path+1); + fprintf(stderr, "Failed to open socket %s : %s\n", addr.sun_path+1, strerror(errno)); return -1; } // connect to the receiver int rval = connect(fd, (struct sockaddr *)&addr, sizeof(addr)); if (rval < 0) { - fprintf(stderr, "Failed to connect to socket %s\n", addr.sun_path+1); + fprintf(stderr, "Failed to connect to socket %s : %s\n", addr.sun_path+1, strerror(errno)); close(fd); return -1; } - ssize_t written = -1; - while (written < 0) { + ssize_t written = 0; + int count = 0; + while (written <= 0) { written = write(fd, buf, size); - if (written != (ssize_t)size) - fprintf(stderr, "ERROR: only wrote %d bytes of %d to %s\n", (int)written, (int)size, addr.sun_path+1); + if (written == (ssize_t)size) + break; + else if (written < 0) + fprintf(stderr, "ERROR: faied to write to %s : %s\n", addr.sun_path+1, strerror(errno)); + else if (written == 0) + fprintf(stderr, "Warning: zero bytes written to %s\n", addr.sun_path+1); + else if (written != (ssize_t)size) { + fprintf(stderr, "ERROR: only %d of %d bytes written to %s\n", (int)written, (int)size, addr.sun_path+1); + break; + } + if (++count >= 100) { + fprintf(stderr, "ERROR: Write failed after %d attempts\n", count-1); + break; + } + std::this_thread::sleep_for(std::chrono::microseconds(5)); } close(fd);