2 * Copyright 2010, Atis Elsts, the.kfx@gmail.com
3 * Distributed under the terms of the MIT license.
9 #include <netinet/in.h>
10 #include <arpa/inet.h>
16 const unsigned short TEST_PORT
= 40000;
22 printf("server [tcp|udp] [4|6] [local-address]\n");
32 int status
= recv(fd
, buffer
, sizeof(buffer
) - 1, 0);
38 printf("received EOF!\n");
42 printf("received %d bytes: \"%s\"\n", status
, buffer
);
49 main(int argc
, char *argv
[])
51 int socketType
= SOCK_DGRAM
;
52 int socketFamily
= AF_INET
;
54 if (!strcmp(argv
[1], "tcp"))
55 socketType
= SOCK_STREAM
;
56 else if (!strcmp(argv
[1], "udp"))
57 socketType
= SOCK_DGRAM
;
62 switch (atoi(argv
[2])) {
64 socketFamily
= AF_INET
;
67 socketFamily
= AF_INET6
;
74 sockaddr_storage localAddress
;
75 memset(&localAddress
, 0, sizeof(localAddress
));
76 localAddress
.ss_family
= socketFamily
;
77 ((sockaddr_in
*) &localAddress
)->sin_port
= htons(TEST_PORT
);
81 void *dstBuffer
= &((sockaddr_in
*) &localAddress
)->sin_addr
;
82 if (inet_pton(AF_INET
, argv
[3], dstBuffer
) == 1) {
83 printf("using IPv4 local address\n");
84 localAddress
.ss_family
= AF_INET
;
88 dstBuffer
= &((sockaddr_in6
*) &localAddress
)->sin6_addr
;
89 if (inet_pton(AF_INET6
, argv
[3], dstBuffer
) == 1) {
90 printf("using IPv6 local address\n");
91 localAddress
.ss_family
= AF_INET6
;
99 int fd
= socket(socketFamily
, socketType
, 0);
105 if (bind(fd
, (sockaddr
*)&localAddress
, localAddress
.ss_family
== AF_INET
?
106 sizeof(sockaddr_in
) : sizeof(sockaddr_in6
)) < 0) {
111 switch (socketType
) {
117 if (listen(fd
, 5) < 0) {
122 int clientfd
= accept(fd
, NULL
, 0);
127 printf("TCP server: got some client!\n");