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