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 <netinet/ip.h>
11 #include <arpa/inet.h>
17 const unsigned short TEST_PROTOCOL
= 89;
25 sockaddr_storage address
;
26 socklen_t socklen
= sizeof(address
);
27 memset(&address
, 0, socklen
);
29 int status
= recvfrom(fd
, buffer
, sizeof(buffer
) - 1, 0,
30 (sockaddr
*) &address
, &socklen
);
36 printf("received EOF!\n");
40 if (address
.ss_family
== AF_INET
&& status
>= sizeof(struct ip
))
41 p
+= sizeof(struct ip
);
43 printf("received %d bytes: \"%s\"\n", status
, p
);
50 main(int argc
, char *argv
[])
52 int socketFamily
= AF_INET
;
55 if (!strcmp(argv
[1], "-4"))
56 socketFamily
= AF_INET
;
57 else if (!strcmp(argv
[1], "-6"))
58 socketFamily
= AF_INET6
;
61 int fd
= socket(socketFamily
, SOCK_RAW
, TEST_PROTOCOL
);
67 sockaddr_storage localAddress
;
68 memset(&localAddress
, 0, sizeof(localAddress
));
69 if (socketFamily
== AF_INET
) {
70 sockaddr_in
*sa
= (sockaddr_in
*) &localAddress
;
71 sa
->sin_family
= AF_INET
;
73 sockaddr_in6
*sa
= (sockaddr_in6
*) &localAddress
;
74 sa
->sin6_family
= AF_INET6
;
77 // TODO: is this even necessary?
78 if (bind(fd
, (sockaddr
*)&localAddress
, socketFamily
== AF_INET
?
79 sizeof(sockaddr_in
) : sizeof(sockaddr_in6
)) < 0) {