xref: /haiku/src/tests/system/network/udp_server.c (revision 5e54f6d4f9dd607ae2afcea4fe72f2f1763e4b5e)
1*5e54f6d4SAugustin Cavalier /*
2*5e54f6d4SAugustin Cavalier  * Copyright 2006, Haiku, Inc. All Rights Reserved.
3*5e54f6d4SAugustin Cavalier  * Distributed under the terms of the MIT License.
4*5e54f6d4SAugustin Cavalier  *
5*5e54f6d4SAugustin Cavalier  * Authors:
6*5e54f6d4SAugustin Cavalier  *		Oliver Tappe, zooey@hirschkaefer.de
7*5e54f6d4SAugustin Cavalier  */
8*5e54f6d4SAugustin Cavalier 
9*5e54f6d4SAugustin Cavalier 
10*5e54f6d4SAugustin Cavalier #include <arpa/inet.h>
11*5e54f6d4SAugustin Cavalier #include <netinet/in.h>
12*5e54f6d4SAugustin Cavalier #include <stdio.h>
13*5e54f6d4SAugustin Cavalier #include <stdlib.h>
14*5e54f6d4SAugustin Cavalier #include <string.h>
15*5e54f6d4SAugustin Cavalier #include <sys/socket.h>
16*5e54f6d4SAugustin Cavalier 
17*5e54f6d4SAugustin Cavalier #define MAXLEN 65536
18*5e54f6d4SAugustin Cavalier 
19*5e54f6d4SAugustin Cavalier 
20*5e54f6d4SAugustin Cavalier static void
udp_server(int sockFD)21*5e54f6d4SAugustin Cavalier udp_server(int sockFD)
22*5e54f6d4SAugustin Cavalier {
23*5e54f6d4SAugustin Cavalier 	char buf[MAXLEN];
24*5e54f6d4SAugustin Cavalier 	long status;
25*5e54f6d4SAugustin Cavalier 
26*5e54f6d4SAugustin Cavalier 	while (1) {
27*5e54f6d4SAugustin Cavalier 		status = recvfrom(sockFD, buf, MAXLEN-1, 0, NULL, NULL);
28*5e54f6d4SAugustin Cavalier 		if (status < 0) {
29*5e54f6d4SAugustin Cavalier 			printf("recvfrom(): %lx (%s)\n", status, strerror(status));
30*5e54f6d4SAugustin Cavalier 			exit(5);
31*5e54f6d4SAugustin Cavalier 		}
32*5e54f6d4SAugustin Cavalier 		buf[status] = 0;
33*5e54f6d4SAugustin Cavalier 		printf("%s", buf);
34*5e54f6d4SAugustin Cavalier 	}
35*5e54f6d4SAugustin Cavalier }
36*5e54f6d4SAugustin Cavalier 
37*5e54f6d4SAugustin Cavalier 
38*5e54f6d4SAugustin Cavalier int
main(int argc,char ** argv)39*5e54f6d4SAugustin Cavalier main(int argc, char** argv)
40*5e54f6d4SAugustin Cavalier {
41*5e54f6d4SAugustin Cavalier 	long status;
42*5e54f6d4SAugustin Cavalier 	int sockFD;
43*5e54f6d4SAugustin Cavalier 	struct sockaddr_in localAddr;
44*5e54f6d4SAugustin Cavalier 
45*5e54f6d4SAugustin Cavalier 	if (argc < 2) {
46*5e54f6d4SAugustin Cavalier 		printf("usage: %s <local-port>\n", argv[0]);
47*5e54f6d4SAugustin Cavalier 		exit(5);
48*5e54f6d4SAugustin Cavalier 	}
49*5e54f6d4SAugustin Cavalier 
50*5e54f6d4SAugustin Cavalier 	sockFD = socket(AF_INET, SOCK_DGRAM, 0);
51*5e54f6d4SAugustin Cavalier 
52*5e54f6d4SAugustin Cavalier 	memset(&localAddr, 0, sizeof(struct sockaddr_in));
53*5e54f6d4SAugustin Cavalier 	localAddr.sin_family = AF_INET;
54*5e54f6d4SAugustin Cavalier 	localAddr.sin_port = htons(atoi(argv[1]));
55*5e54f6d4SAugustin Cavalier 	printf("binding to port %u\n", ntohs(localAddr.sin_port));
56*5e54f6d4SAugustin Cavalier 	status = bind(sockFD, (struct sockaddr *)&localAddr, sizeof(struct sockaddr_in));
57*5e54f6d4SAugustin Cavalier 	if (status < 0) {
58*5e54f6d4SAugustin Cavalier 		printf("bind(): %lx (%s)\n", status, strerror(status));
59*5e54f6d4SAugustin Cavalier 		exit(5);
60*5e54f6d4SAugustin Cavalier 	}
61*5e54f6d4SAugustin Cavalier 
62*5e54f6d4SAugustin Cavalier 	udp_server(sockFD);
63*5e54f6d4SAugustin Cavalier 	return 0;
64*5e54f6d4SAugustin Cavalier }
65