Add client/server over UDP for testing purposes.
[swifty.git] / test / server_udp.c
1 #include "../src/kernel/swift.h"
2
3 #include <sys/socket.h>
4 #include <sys/types.h>
5 #include <stdio.h>
6 #include <string.h>
7 #include <netinet/in.h>
8 #include <stdlib.h>
9
10 #define ADDR 0x8182A8C0
11 #define NUM_BUF 10
12
13 int main(int argc, const char *argv[])
14 {
15     int sock;
16         int i;
17
18     if (argc != 2) {
19         fprintf(stderr, "USAGE: %s listening_port\n", argv[0]);
20         return -1;
21     }
22
23     sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
24     if (sock < 0) {
25         perror("Failed to create socket");
26         return -1;
27     }
28
29     struct sockaddr_in saddr;
30     memset(&saddr, 0, sizeof(saddr));
31
32         saddr.sin_addr.s_addr = ADDR;
33         saddr.sin_port = htons(atoi(argv[1]));
34         saddr.sin_family = AF_INET;
35
36     if (bind(sock, (struct sockaddr *) &saddr, sizeof(saddr)) < 0) {
37         perror("Failed to bind socket");
38         close(sock);
39         return -1;
40     }
41
42     char buf[4096];
43     struct iovec iov[1];
44     struct msghdr msg;
45     struct sockaddr_in from;
46
47     memset(&msg, 0, sizeof(msg));
48     memset(&iov, 0, sizeof(iov));
49     memset(&from, 0, sizeof(from));
50
51         iov[0].iov_base = buf;
52         iov[0].iov_len = sizeof(buf);
53
54     msg.msg_iov = iov;
55     msg.msg_iovlen = 1;
56     msg.msg_name = &from;
57     msg.msg_namelen = sizeof(from);
58
59     int ret, fromlen;
60
61     ret = recvmsg(sock, &msg, 0);
62     if (ret < 0) {
63         perror("Failed to recv on socket");
64         return -1;
65     }
66
67     printf("Received %d bytes on socket\n", ret);
68         printf("buf=%s\n", buf);
69
70     if (close(sock) < 0) {
71         perror("Failed to close socket");
72         return -1;
73     }
74
75     return 0;
76 }