]> rtime.felk.cvut.cz Git - frescor/fna.git/blob - tests/tests_unix_fna/test_unix_send_receive.c
unix fna, it seems to work
[frescor/fna.git] / tests / tests_unix_fna / test_unix_send_receive.c
1 #include <stdio.h>
2 #include <stdlib.h> /* atoi */
3 #include <unistd.h> /* sleep */
4 #include <assert.h>
5 #include <string.h> /* memset */
6
7 #include <sys/socket.h>
8 #include <sys/un.h> /* struct sockaddr_un */
9
10 #define SENDER_PATH     "/tmp/sender_addr"
11 #define RECEIVER_PATH   "/tmp/receiver_addr"
12
13 void sender(void);
14 void receiver(void);
15
16 int main (int argc, char **argv)
17 {
18         if (argc != 2) {
19                 printf("please provide the node to execute:\n");
20                 printf("  $./mprogram 0 (sender)\n");
21                 printf("  $./mprogram 1 (receiver)\n");
22                 return -1;
23         }
24
25         switch(atoi(argv[1])) {
26         case 0:
27                 sender();
28                 break;
29         case 1:
30                 receiver();
31                 break;
32         default:
33                 printf("wrong node number\n");
34                 return -1;
35         }
36
37         unlink(SENDER_PATH);
38         unlink(RECEIVER_PATH);
39
40         return 0;
41 }
42
43 void sender(void)
44 {
45         int sock, err, i;
46         struct sockaddr_un sender_addr, receiver_addr;
47         char buffer[100];
48         size_t size;
49         ssize_t sent_bytes;
50
51         printf("I am the sender\n");
52
53         sock = socket(AF_UNIX, SOCK_DGRAM, 0);
54         assert(sock >= 0);
55
56         memset(&sender_addr, 0, sizeof(sender_addr));
57         sender_addr.sun_family = AF_UNIX;
58         strcpy(sender_addr.sun_path, SENDER_PATH);
59
60         err = bind(sock, (struct sockaddr *)&sender_addr, sizeof(sender_addr));
61         assert(err >= 0);
62
63         memset(&receiver_addr, 0, sizeof(receiver_addr));
64         receiver_addr.sun_family = AF_UNIX;
65         strcpy(receiver_addr.sun_path, RECEIVER_PATH);
66
67         for(i=0; i<10; i++) {
68                 sleep(1);
69                 size = snprintf(buffer, sizeof(buffer), "hello world %d", i);
70                 sent_bytes = sendto(sock,
71                                     buffer,
72                                     size,
73                                     0,
74                                     (struct sockaddr *) &receiver_addr,
75                                     sizeof(receiver_addr));
76
77                 assert(sent_bytes >= 0);
78
79                 printf("sender : sent %s\n", buffer);
80         }
81
82         close(sock);
83         printf("Sender done\n");
84 }
85
86 void receiver(void)
87 {
88         int sock, err, i;
89         struct sockaddr_un sender_addr, receiver_addr;
90         char buffer[100];
91         ssize_t received_bytes;
92         socklen_t from_len;
93
94         printf("I am the receiver\n");
95
96         sock = socket(AF_UNIX, SOCK_DGRAM, 0);
97         assert(sock >= 0);
98
99         memset(&receiver_addr, 0, sizeof(receiver_addr));
100         receiver_addr.sun_family = AF_UNIX;
101         strcpy(receiver_addr.sun_path, RECEIVER_PATH);
102
103         err = bind(sock, (struct sockaddr *)&receiver_addr, sizeof(receiver_addr));
104         assert(err >= 0);
105
106         for(i=0; i<10; i++) {
107                 from_len = sizeof(sender_addr);
108                 received_bytes = recvfrom(sock,
109                                           buffer,
110                                           sizeof(buffer),
111                                           0,
112                                           (struct sockaddr *)&sender_addr,
113                                           &from_len);
114
115                 assert(received_bytes >= 0);
116
117                 buffer[received_bytes] = '\0';
118                 printf("receiver : received %s\n", buffer);
119         }
120
121         close(sock);
122         printf("receiver done\n");
123 }