initial import
[udp_printf_client.git] / udp_printf_client.c
blobb60218ad83aa9e902a7ecad874187a5b909d030e
2 /*
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation; version 2 of the License.
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
12 * You should have received a copy of the GNU General Public License
13 * along with this program; if not, write to the Free Software
14 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 #include <stdio.h>
18 #include <stdlib.h>
19 #include <string.h>
20 #include <unistd.h>
21 #include <sys/types.h>
22 #include <sys/socket.h>
23 #include <netinet/in.h>
24 #include <arpa/inet.h>
26 #define UDP_PRINTF_DEFAULT_PORT 9999
29 * usage
31 static void usage(const char *progname)
33 fprintf(stderr, "usage: %s [port]\n", progname);
35 exit(1);
39 * main
41 int main(int argc, char **argv)
43 char *endptr;
44 int port, sock, error, n;
45 struct sockaddr_in sockaddr;
46 char buf[4096];
48 port = UDP_PRINTF_DEFAULT_PORT;
50 if (argc > 1) {
51 port = strtol(argv[1], &endptr, 0);
52 if ((*endptr != '\0') || (port < 0) || (port > 65535))
53 usage(argv[0]);
56 sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
57 if (sock < 0) {
58 perror("bind");
59 return 1;
62 memset(&sockaddr, 0, sizeof(sockaddr));
63 sockaddr.sin_family = AF_INET;
64 sockaddr.sin_addr.s_addr = INADDR_ANY;
65 sockaddr.sin_port = htons(port);
67 error = bind(sock, (const struct sockaddr*) &sockaddr, sizeof(sockaddr));
68 if (error) {
69 perror("bind");
70 return 1;
73 while (1) {
74 n = read(sock, buf, sizeof(buf) - 1);
75 if (n <= 0)
76 continue;
78 buf[n] = 0;
80 fprintf(stdout, buf, strlen(buf));
81 fflush(stdout);
84 return 0;