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;
20 main(int argc
, char *argv
[])
22 int socketFamily
= AF_INET
;
26 if (!strcmp(argv
[i
], "-4")) {
28 socketFamily
= AF_INET
;
29 } else if (!strcmp(argv
[i
], "-6")) {
31 socketFamily
= AF_INET6
;
34 in_addr multicastSource
;
35 multicastSource
.s_addr
= 0;
37 if (!strcmp(argv
[i
], "-s")) {
39 if (inet_aton(argv
[i
], &multicastSource
) == 0) {
40 fprintf(stderr
, "IPv4 source address expected");
47 int fd
= socket(socketFamily
, SOCK_DGRAM
, 0);
53 sockaddr_storage saddr
;
54 memset(&saddr
, 0, sizeof(saddr
));
55 if (socketFamily
== AF_INET
) {
56 sockaddr_in
*sa
= (sockaddr_in
*) &saddr
;
57 sa
->sin_family
= AF_INET
;
58 sa
->sin_port
= htons(TEST_PORT
);
59 sa
->sin_addr
.s_addr
= htonl(INADDR_ALLHOSTS_GROUP
);
61 sockaddr_in6
*sa
= (sockaddr_in6
*) &saddr
;
62 sa
->sin6_family
= AF_INET6
;
63 sa
->sin6_port
= htons(TEST_PORT
);
64 // ff01::1 (all nodes multicast)
65 sa
->sin6_addr
.s6_addr
[0] = 0xff;
66 sa
->sin6_addr
.s6_addr
[1] = 0x01;
67 sa
->sin6_addr
.s6_addr
[15] = 0x01;
70 if (multicastSource
.s_addr
) {
71 if (setsockopt(fd
, IPPROTO_IP
, IP_MULTICAST_IF
,
72 &multicastSource
, sizeof(multicastSource
)) < 0) {
73 perror("setsockopt IP_MULTICAST_IF");
78 const char *buffer
= "hello world";
79 unsigned length
= strlen(buffer
);
80 int status
= sendto(fd
, buffer
, length
, 0, (sockaddr
*) &saddr
,
81 socketFamily
== AF_INET
? sizeof(sockaddr_in
) : sizeof(sockaddr_in6
));
82 if (status
< length
) {
86 printf("no data sent!\n");
88 printf("not all data sent!\n");
90 printf("send(): success\n");