#include #include #include #include #include #include #include #include #define SOCK_PATH "/tmp/mysocket" int sfd; int server () { struct sockaddr_un un; if (unlink (SOCK_PATH) < 0 && errno != ENOENT) { printf ("unlink: %d <%s>\n", errno, strerror (errno)); return -1; } sfd = socket (AF_UNIX, SOCK_DGRAM | SOCK_NONBLOCK, 0); if (sfd < 0) { printf ("SRV socket: %d <%s>\n", errno, strerror (errno)); return -1; } memset (&un, 0, sizeof un); un.sun_family = AF_UNIX; strcpy (un.sun_path, SOCK_PATH); if (bind (sfd, (const struct sockaddr *) &un, sizeof un) < 0) { printf ("SRV bind: %d <%s>\n", errno, strerror (errno)); return -1; } return 0; } int main () { int fd; struct sockaddr_un un; fd = socket (AF_UNIX, SOCK_DGRAM | SOCK_NONBLOCK, 0); if (fd < 0) { printf ("socket: %d <%s>\n", errno, strerror (errno)); return 1; } if (server ()) return 2; memset (&un, 0, sizeof un); un.sun_family = AF_UNIX; strcpy (un.sun_path, SOCK_PATH); #define COUNT 64 * 1024 for (int i = 0; i < COUNT; i++) { if (sendto (fd, &i, sizeof i, 0, (struct sockaddr *) &un, sizeof un) != sizeof i) { printf ("sendto: %d <%s>, i = %d\n", errno, strerror (errno), i); return 3; } } for (int i = 0; i < COUNT; i++) { int j = -1; ssize_t nr = recv (sfd, &j, sizeof j, 0); if (nr < 0) { printf ("recv: %d <%s>, i = %d\n", errno, strerror (errno), i); return 4; } if (nr != sizeof j) { printf ("partial read, i = %d\n", i); return 5; } if (i != j) printf ("i = %d, j = %d\n", i, j); } }