+#include <stdio.h>
+#include <stdlib.h> /* atoi */
+#include <unistd.h> /* sleep */
+#include <assert.h>
+#include <string.h> /* memset */
+
+#include <sys/socket.h>
+#include <sys/un.h> /* struct sockaddr_un */
+
+#define SENDER_PATH "/tmp/sender_addr"
+#define RECEIVER_PATH "/tmp/receiver_addr"
+
+void sender(void);
+void receiver(void);
+
+int main (int argc, char **argv)
+{
+ if (argc != 2) {
+ printf("please provide the node to execute:\n");
+ printf(" $./mprogram 0 (sender)\n");
+ printf(" $./mprogram 1 (receiver)\n");
+ return -1;
+ }
+
+ switch(atoi(argv[1])) {
+ case 0:
+ sender();
+ break;
+ case 1:
+ receiver();
+ break;
+ default:
+ printf("wrong node number\n");
+ return -1;
+ }
+
+ unlink(SENDER_PATH);
+ unlink(RECEIVER_PATH);
+
+ return 0;
+}
+
+void sender(void)
+{
+ int sock, err, i;
+ struct sockaddr_un sender_addr, receiver_addr;
+ char buffer[100];
+ size_t size;
+ ssize_t sent_bytes;
+
+ printf("I am the sender\n");
+
+ err = sock = socket(AF_UNIX, SOCK_DGRAM, 0);
+ assert(err >= 0);
+
+ memset(&sender_addr, 0, sizeof(sender_addr));
+ sender_addr.sun_family = AF_UNIX;
+ strcpy(sender_addr.sun_path, SENDER_PATH);
+
+ err = bind(sock, (struct sockaddr *)&sender_addr, sizeof(sender_addr));
+ assert(err >= 0);
+
+ memset(&receiver_addr, 0, sizeof(receiver_addr));
+ receiver_addr.sun_family = AF_UNIX;
+ strcpy(receiver_addr.sun_path, RECEIVER_PATH);
+
+ for(i=0; i<10; i++) {
+ sleep(1);
+ size = snprintf(buffer, sizeof(buffer), "hello world %d", i);
+ sent_bytes = sendto(sock,
+ buffer,
+ size,
+ 0,
+ (struct sockaddr *) &receiver_addr,
+ sizeof(receiver_addr));
+
+ assert(sent_bytes >= 0);
+
+ printf("sender : sent %s\n", buffer);
+ }
+
+ close(sock);
+ printf("Sender done\n");
+}
+
+void receiver(void)
+{
+ int sock, err, i;
+ struct sockaddr_un sender_addr, receiver_addr;
+ char buffer[100];
+ ssize_t received_bytes;
+ socklen_t from_len;
+
+ printf("I am the receiver\n");
+
+ err = sock = socket(AF_UNIX, SOCK_DGRAM, 0);
+ assert(err >= 0);
+
+ memset(&receiver_addr, 0, sizeof(receiver_addr));
+ receiver_addr.sun_family = AF_UNIX;
+ strcpy(receiver_addr.sun_path, RECEIVER_PATH);
+
+ err = bind(sock, (struct sockaddr *)&receiver_addr, sizeof(receiver_addr));
+ assert(err >= 0);
+
+ for(i=0; i<10; i++) {
+
+ sleep(5);
+
+ from_len = sizeof(sender_addr);
+ received_bytes = recvfrom(sock,
+ buffer,
+ sizeof(buffer),
+ 0,
+ (struct sockaddr *)&sender_addr,
+ &from_len);
+
+ assert(received_bytes >= 0);
+
+ buffer[received_bytes] = '\0';
+ printf("receiver : received %s\n", buffer);
+ }
+
+ close(sock);
+ printf("receiver done\n");
+}