8
8
#include <arpa/inet.h>
9
9
#include <string.h>
10
10
11
+ #define IPv4 (a , b , c , d ) ((uint32_t)(((a) & 0xff) << 24) | \
12
+ (((b) & 0xff) << 16) | \
13
+ (((c) & 0xff) << 8) | \
14
+ ((d) & 0xff))
15
+
11
16
#define ERR_EXIT (m ) \
12
17
do { \
13
18
perror(m); \
14
19
exit(EXIT_FAILURE); \
15
20
} while (0)
16
21
22
+ #define BIND_ADDR INADDR_ANY
23
+ //#define BIND_ADDR IPv4(0,0,0,0)
24
+
17
25
int main (int argc , char * argv [])
18
26
{
19
- int sock , on ;
27
+ int sock , port , n ;
20
28
struct sockaddr_in servaddr , peeraddr ;
21
29
char recvbuf [1024 ] = {0 };
22
30
socklen_t peerlen ;
23
- int n ;
31
+ //int on;
32
+
24
33
25
- if (argc != 2 ) {
34
+ if (!( argc == 2 && ( port = atoi ( argv [ 1 ]))) ) {
26
35
fprintf (stderr , "Usage\n\t%s <port> \n" ,
27
36
argv [0 ]);
28
37
exit (EXIT_FAILURE );
@@ -31,15 +40,19 @@ int main(int argc, char *argv[])
31
40
if ((sock = socket (PF_INET , SOCK_DGRAM , 0 )) < 0 )
32
41
ERR_EXIT ("socket error" );
33
42
34
- on = 1 ;
35
- setsockopt ( sock , SOL_SOCKET , SO_REUSEADDR , & on , sizeof (on ) );
43
+ //on = 1;
44
+ //setsockopt( sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on) );
45
+ //
46
+
47
+ printf ("port %d\n" , port );
36
48
37
49
memset (& servaddr , 0 , sizeof (servaddr ));
38
50
servaddr .sin_family = AF_INET ;
39
- servaddr .sin_port = htons (atoi ( argv [ 1 ]) );
40
- servaddr .sin_addr .s_addr = htonl (INADDR_ANY );
51
+ servaddr .sin_port = htons (port );
52
+ servaddr .sin_addr .s_addr = htonl (BIND_ADDR );
41
53
42
- printf ("serv %s:%d \n" , inet_ntoa (servaddr .sin_addr ), ntohs (servaddr .sin_port ));
54
+ printf ("serv %s:%d \n" , inet_ntoa (servaddr .sin_addr ),
55
+ ntohs (servaddr .sin_port ));
43
56
44
57
if (bind (sock , (struct sockaddr * )& servaddr , sizeof (servaddr )) < 0 )
45
58
ERR_EXIT ("bind error" );
@@ -50,13 +63,16 @@ int main(int argc, char *argv[])
50
63
n = recvfrom (sock , recvbuf , sizeof (recvbuf ), 0 ,
51
64
(struct sockaddr * )& peeraddr , & peerlen );
52
65
if (n == -1 ) {
53
-
54
66
if (errno == EINTR )
55
67
continue ;
56
-
57
68
ERR_EXIT ("recvfrom error" );
58
69
}else if (n > 0 ) {
59
- printf ("recv %d %s:%d\n" , peerlen , inet_ntoa (peeraddr .sin_addr ), ntohs (peeraddr .sin_port ));
70
+ printf ("recv(%d) peer from %s:%d\n" ,
71
+ n , inet_ntoa (peeraddr .sin_addr ),
72
+ ntohs (peeraddr .sin_port ));
73
+ sendto (sock , recvbuf , n , 0 ,
74
+ (struct sockaddr * )& peeraddr ,
75
+ sizeof (peeraddr ));
60
76
fputs (recvbuf , stdout );
61
77
}
62
78
}
0 commit comments