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