|
|
|
|
@ -19,6 +19,9 @@
|
|
|
|
|
#include <stdio.h>
|
|
|
|
|
#include <unistd.h>
|
|
|
|
|
#include <string.h>
|
|
|
|
|
#include <cstring>
|
|
|
|
|
#include <thread>
|
|
|
|
|
#include <chrono>
|
|
|
|
|
#include <errno.h>
|
|
|
|
|
#include <fcntl.h>
|
|
|
|
|
#include <sys/socket.h>
|
|
|
|
|
@ -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);
|
|
|
|
|
|