1*5e54f6d4SAugustin Cavalier /*
2*5e54f6d4SAugustin Cavalier * Copyright 2010, Atis Elsts, the.kfx@gmail.com
3*5e54f6d4SAugustin Cavalier * Distributed under the terms of the MIT license.
4*5e54f6d4SAugustin Cavalier */
5*5e54f6d4SAugustin Cavalier
6*5e54f6d4SAugustin Cavalier
7*5e54f6d4SAugustin Cavalier #include <unistd.h>
8*5e54f6d4SAugustin Cavalier #include <memory.h>
9*5e54f6d4SAugustin Cavalier #include <netinet/in.h>
10*5e54f6d4SAugustin Cavalier #include <arpa/inet.h>
11*5e54f6d4SAugustin Cavalier #include <errno.h>
12*5e54f6d4SAugustin Cavalier #include <stdio.h>
13*5e54f6d4SAugustin Cavalier #include <stdlib.h>
14*5e54f6d4SAugustin Cavalier
15*5e54f6d4SAugustin Cavalier
16*5e54f6d4SAugustin Cavalier const unsigned short TEST_PORT = 40000;
17*5e54f6d4SAugustin Cavalier
18*5e54f6d4SAugustin Cavalier
19*5e54f6d4SAugustin Cavalier int
main(int argc,char * argv[])20*5e54f6d4SAugustin Cavalier main(int argc, char *argv[])
21*5e54f6d4SAugustin Cavalier {
22*5e54f6d4SAugustin Cavalier int socketFamily = AF_INET;
23*5e54f6d4SAugustin Cavalier
24*5e54f6d4SAugustin Cavalier if (argc > 1) {
25*5e54f6d4SAugustin Cavalier if (!strcmp(argv[1], "-4"))
26*5e54f6d4SAugustin Cavalier socketFamily = AF_INET;
27*5e54f6d4SAugustin Cavalier else if (!strcmp(argv[1], "-6"))
28*5e54f6d4SAugustin Cavalier socketFamily = AF_INET6;
29*5e54f6d4SAugustin Cavalier }
30*5e54f6d4SAugustin Cavalier
31*5e54f6d4SAugustin Cavalier int fd = socket(socketFamily, SOCK_DGRAM, 0);
32*5e54f6d4SAugustin Cavalier if (fd < 0) {
33*5e54f6d4SAugustin Cavalier perror("socket");
34*5e54f6d4SAugustin Cavalier return -1;
35*5e54f6d4SAugustin Cavalier }
36*5e54f6d4SAugustin Cavalier
37*5e54f6d4SAugustin Cavalier sockaddr_storage saddr;
38*5e54f6d4SAugustin Cavalier memset(&saddr, 0, sizeof(saddr));
39*5e54f6d4SAugustin Cavalier if (socketFamily == AF_INET) {
40*5e54f6d4SAugustin Cavalier sockaddr_in *sa = (sockaddr_in *) &saddr;
41*5e54f6d4SAugustin Cavalier sa->sin_family = AF_INET;
42*5e54f6d4SAugustin Cavalier sa->sin_port = htons(TEST_PORT);
43*5e54f6d4SAugustin Cavalier sa->sin_addr.s_addr = htonl(INADDR_LOOPBACK);
44*5e54f6d4SAugustin Cavalier } else {
45*5e54f6d4SAugustin Cavalier sockaddr_in6 *sa = (sockaddr_in6 *) &saddr;
46*5e54f6d4SAugustin Cavalier sa->sin6_family = AF_INET6;
47*5e54f6d4SAugustin Cavalier sa->sin6_port = htons(TEST_PORT);
48*5e54f6d4SAugustin Cavalier sa->sin6_addr.s6_addr[15] = 0x01; // loopback
49*5e54f6d4SAugustin Cavalier
50*5e54f6d4SAugustin Cavalier // 2001::1
51*5e54f6d4SAugustin Cavalier // sa->sin6_addr.s6_addr[0] = 0x20;
52*5e54f6d4SAugustin Cavalier // sa->sin6_addr.s6_addr[1] = 0x01;
53*5e54f6d4SAugustin Cavalier // sa->sin6_addr.s6_addr[15] = 0x01;
54*5e54f6d4SAugustin Cavalier }
55*5e54f6d4SAugustin Cavalier
56*5e54f6d4SAugustin Cavalier const char *buffer = "hello world";
57*5e54f6d4SAugustin Cavalier unsigned length = strlen(buffer);
58*5e54f6d4SAugustin Cavalier int status = sendto(fd, buffer, length, 0, (sockaddr *) &saddr,
59*5e54f6d4SAugustin Cavalier socketFamily == AF_INET ? sizeof(sockaddr_in) : sizeof(sockaddr_in6));
60*5e54f6d4SAugustin Cavalier if (status < length) {
61*5e54f6d4SAugustin Cavalier if (status < 0)
62*5e54f6d4SAugustin Cavalier perror("sendto");
63*5e54f6d4SAugustin Cavalier else if (status == 0)
64*5e54f6d4SAugustin Cavalier printf("no data sent!\n");
65*5e54f6d4SAugustin Cavalier else
66*5e54f6d4SAugustin Cavalier printf("not all data sent!\n");
67*5e54f6d4SAugustin Cavalier } else
68*5e54f6d4SAugustin Cavalier printf("send(): success\n");
69*5e54f6d4SAugustin Cavalier
70*5e54f6d4SAugustin Cavalier close(fd);
71*5e54f6d4SAugustin Cavalier return 0;
72*5e54f6d4SAugustin Cavalier }
73