xref: /haiku/src/tests/system/network/ipv6/udp_client.cpp (revision 5e54f6d4f9dd607ae2afcea4fe72f2f1763e4b5e)
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