xref: /haiku/src/tests/system/network/udp_connect.cpp (revision 5e54f6d4f9dd607ae2afcea4fe72f2f1763e4b5e)
1*5e54f6d4SAugustin Cavalier /*
2*5e54f6d4SAugustin Cavalier  * Copyright 2010, Axel Dörfler, axeld@pinc-software.de.
3*5e54f6d4SAugustin Cavalier  * This file may be used under the terms of the MIT License.
4*5e54f6d4SAugustin Cavalier  */
5*5e54f6d4SAugustin Cavalier 
6*5e54f6d4SAugustin Cavalier 
7*5e54f6d4SAugustin Cavalier #include <arpa/inet.h>
8*5e54f6d4SAugustin Cavalier #include <netinet/in.h>
9*5e54f6d4SAugustin Cavalier #include <sys/socket.h>
10*5e54f6d4SAugustin Cavalier #include <stdio.h>
11*5e54f6d4SAugustin Cavalier #include <string.h>
12*5e54f6d4SAugustin Cavalier #include <unistd.h>
13*5e54f6d4SAugustin Cavalier 
14*5e54f6d4SAugustin Cavalier 
15*5e54f6d4SAugustin Cavalier static bool sReceiveMode = false;
16*5e54f6d4SAugustin Cavalier 
17*5e54f6d4SAugustin Cavalier 
18*5e54f6d4SAugustin Cavalier int
main(int argc,char ** argv)19*5e54f6d4SAugustin Cavalier main(int argc, char** argv)
20*5e54f6d4SAugustin Cavalier {
21*5e54f6d4SAugustin Cavalier 	const char* peerAddress = "192.168.0.1";
22*5e54f6d4SAugustin Cavalier 	if (argc > 1)
23*5e54f6d4SAugustin Cavalier 		peerAddress = argv[1];
24*5e54f6d4SAugustin Cavalier 
25*5e54f6d4SAugustin Cavalier 	if (argc > 2 && !strcmp(argv[2], "recv"))
26*5e54f6d4SAugustin Cavalier 		sReceiveMode = true;
27*5e54f6d4SAugustin Cavalier 
28*5e54f6d4SAugustin Cavalier 	int fd = socket(AF_INET, SOCK_DGRAM, 0);
29*5e54f6d4SAugustin Cavalier 	if (fd < 0)
30*5e54f6d4SAugustin Cavalier 		return 1;
31*5e54f6d4SAugustin Cavalier 
32*5e54f6d4SAugustin Cavalier #if 1
33*5e54f6d4SAugustin Cavalier 	sockaddr_in addr;
34*5e54f6d4SAugustin Cavalier 	addr.sin_family = AF_INET;
35*5e54f6d4SAugustin Cavalier 	addr.sin_addr.s_addr = INADDR_ANY;
36*5e54f6d4SAugustin Cavalier 	addr.sin_port = htons(sReceiveMode ? 8888 : 0);
37*5e54f6d4SAugustin Cavalier 	if (bind(fd, (sockaddr*)&addr, sizeof(addr)) != 0)
38*5e54f6d4SAugustin Cavalier 		perror("bind");
39*5e54f6d4SAugustin Cavalier 
40*5e54f6d4SAugustin Cavalier 	sockaddr ours;
41*5e54f6d4SAugustin Cavalier 	socklen_t ourLength = sizeof(sockaddr);
42*5e54f6d4SAugustin Cavalier 	if (getsockname(fd, &ours, &ourLength) != 0)
43*5e54f6d4SAugustin Cavalier 		perror("getsockname");
44*5e54f6d4SAugustin Cavalier 	else {
45*5e54f6d4SAugustin Cavalier 		printf("After bind: local address %s (%u)\n",
46*5e54f6d4SAugustin Cavalier 			inet_ntoa(((sockaddr_in&)ours).sin_addr),
47*5e54f6d4SAugustin Cavalier 			ntohs(((sockaddr_in&)ours).sin_port));
48*5e54f6d4SAugustin Cavalier 	}
49*5e54f6d4SAugustin Cavalier #endif
50*5e54f6d4SAugustin Cavalier 
51*5e54f6d4SAugustin Cavalier 	if (!sReceiveMode) {
52*5e54f6d4SAugustin Cavalier 		sockaddr_in peer;
53*5e54f6d4SAugustin Cavalier 		peer.sin_family = AF_INET;
54*5e54f6d4SAugustin Cavalier 		peer.sin_addr.s_addr = inet_addr(peerAddress);
55*5e54f6d4SAugustin Cavalier 		peer.sin_port = htons(sReceiveMode ? 0 : 8888);
56*5e54f6d4SAugustin Cavalier 		if (connect(fd, (sockaddr*)&peer, sizeof(peer)) != 0)
57*5e54f6d4SAugustin Cavalier 			perror("connect");
58*5e54f6d4SAugustin Cavalier 
59*5e54f6d4SAugustin Cavalier 		ourLength = sizeof(sockaddr);
60*5e54f6d4SAugustin Cavalier 		if (getsockname(fd, &ours, &ourLength) != 0)
61*5e54f6d4SAugustin Cavalier 			perror("getsockname");
62*5e54f6d4SAugustin Cavalier 		else {
63*5e54f6d4SAugustin Cavalier 			printf("After connect: local address %s (%u)\n",
64*5e54f6d4SAugustin Cavalier 				inet_ntoa(((sockaddr_in&)ours).sin_addr),
65*5e54f6d4SAugustin Cavalier 				ntohs(((sockaddr_in&)ours).sin_port));
66*5e54f6d4SAugustin Cavalier 		}
67*5e54f6d4SAugustin Cavalier 	}
68*5e54f6d4SAugustin Cavalier 
69*5e54f6d4SAugustin Cavalier 	char buffer[256];
70*5e54f6d4SAugustin Cavalier 	if (sReceiveMode) {
71*5e54f6d4SAugustin Cavalier 		ssize_t bytesReceived = recv(fd, buffer, sizeof(buffer), 0);
72*5e54f6d4SAugustin Cavalier 		if (bytesReceived > 0) {
73*5e54f6d4SAugustin Cavalier 			buffer[bytesReceived] = 0;
74*5e54f6d4SAugustin Cavalier 			printf("received: %s\n", buffer);
75*5e54f6d4SAugustin Cavalier 		} else
76*5e54f6d4SAugustin Cavalier 			perror("recv");
77*5e54f6d4SAugustin Cavalier 	} else {
78*5e54f6d4SAugustin Cavalier 		if (argc > 2)
79*5e54f6d4SAugustin Cavalier 			send(fd, argv[2], strlen(argv[2]), 0);
80*5e54f6d4SAugustin Cavalier 		else {
81*5e54f6d4SAugustin Cavalier 			fgets(buffer, sizeof(buffer), stdin);
82*5e54f6d4SAugustin Cavalier 			send(fd, buffer, strlen(buffer), 0);
83*5e54f6d4SAugustin Cavalier 		}
84*5e54f6d4SAugustin Cavalier 	}
85*5e54f6d4SAugustin Cavalier 
86*5e54f6d4SAugustin Cavalier 	close(fd);
87*5e54f6d4SAugustin Cavalier 	return 0;
88*5e54f6d4SAugustin Cavalier }
89*5e54f6d4SAugustin Cavalier 
90*5e54f6d4SAugustin Cavalier 
91