Add option for a different destination address in the client.
[swifty.git] / test / client.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 0x80BEA8C0
11 #define DADDR 0x81BEA8C0
12
13 int main(int argc, const char *argv[])
14 {
15     int sock;
16
17     sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_SWIFT);
18     if (sock < 0) {
19         perror("Failed to create socket");
20         return -1;
21     }
22
23     int size = sizeof(struct sockaddr_swift) + sizeof(struct swift_dest);
24     struct sockaddr_swift *saddr = malloc(size);
25     memset(saddr, 0, size);
26
27     saddr->count = 1;
28     saddr->dests[0].addr = ADDR;
29     saddr->dests[0].port = 50;
30
31     if (bind(sock, (struct sockaddr *) saddr, size) < 0) {
32         perror("Failed to bind socket");
33         close(sock);
34         return -1;
35     }
36
37     char buf[] = "Buffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de test";
38     char buf2[] = "Buffer2";
39     struct iovec iov[2];
40     struct msghdr msg;
41     int size2 = sizeof(struct sockaddr_swift) + 2 * sizeof(struct swift_dest);
42     struct sockaddr_swift *to = malloc(size2);
43
44     memset(&msg, 0, sizeof(msg));
45     memset(&iov, 0, sizeof(iov));
46     memset(to, 0, size2);
47
48     iov[0].iov_base = buf;
49     iov[0].iov_len = sizeof(buf);
50     iov[1].iov_base = buf2;
51     iov[1].iov_len = sizeof(buf2);
52
53     to->count = 2;
54     to->dests[0].addr = DADDR;
55     to->dests[0].port = 100;
56     to->dests[1].addr = DADDR;
57     to->dests[1].port = 101;
58
59     msg.msg_iov = iov;
60     msg.msg_iovlen = 2;
61     msg.msg_name = to;
62     msg.msg_namelen = size2;
63
64     int ret;
65
66     ret = sendmsg(sock, &msg, sizeof(msg));
67     if (ret < 0) {
68         perror("Failed to send on socket");
69         return -1;
70     }
71
72     printf("Sent %d bytes on socket\n", msg.msg_namelen);
73
74     if (close(sock) < 0) {
75         perror("Failed to close socket");
76         return -1;
77     }
78
79     free(saddr);
80     free(to);
81     return 0;
82 }