UDPマルチキャストの送信と受信コードの例
マルチキャストパケットの送受信は依然としてUDPソケットによって実現される.マルチキャストパケット送信の流れを以下に示す.(1)UDPソケットを作成する.(2)宛先アドレスとポートを指定する.(3)パケットを送信する.
マルチキャストパケット受信プロセスは以下の通りである.(1)UDPソケットを作成する.(2)アドレスとポートをバインドする.(3)マルチキャストグループに参加する.(4)パケットを受信する.
1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9
10 #define N 128
11 #define errlog(errmsg) do{perror(errmsg);\
12 printf("%s--%s--%d
",\
13 __FILE__, __func__, __LINE__);\
14 exit(1);\
15 }while(0)
16
17 int main(int argc, const char *argv[])
18 {
19 int sockfd;
20 struct sockaddr_in groupcastaddr;
21 socklen_t addrlen = sizeof(groupcastaddr);
22 char buf[N] = {};
23
24 if(argc < 3)
25 {
26 fprintf(stderr, "Usage: %s ip port
", argv[0]);
27 exit(1);
28 }
29
30 // :
31 if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
32 {
33 errlog("fail to socket");
34 }
35
36 // :
37 //inet_addr: ip
38 //htons:
39 //atoi:
40 groupcastaddr.sin_family = AF_INET;
41 //224.x.x.x - 239.x.x.x
42 groupcastaddr.sin_addr.s_addr = inet_addr(argv[1]);
43 groupcastaddr.sin_port = htons(atoi(argv[2]));
44
45 while(1)
46 {
47 fgets(buf, N, stdin);
48 buf[strlen(buf) - 1] = '\0';
49
50 if(sendto(sockfd, buf, N, 0,\
51 (struct sockaddr *)&groupcastaddr, addrlen) < 0)
52 {
53 errlog("fail to sendto");
54 }
55
56 }
57
58 close(sockfd);
59
60 return 0;
61 }
IPv4 (AF_INET) , ip_mreq 。
typedef uint32_t in_addr_t;
struct in_addr{
in_addr_t s_addr;
};
struct ip_mreq {
struct in_addr imr_multiaddr; /* IP */
struct in_addr imr_interface; /* IP */
};
マルチキャストパケット受信プロセスは以下の通りである.(1)UDPソケットを作成する.(2)アドレスとポートをバインドする.(3)マルチキャストグループに参加する.(4)パケットを受信する.
1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9
10 #define N 128
11 #define errlog(errmsg) do{perror(errmsg);\
12 printf("%s--%s--%d
",\
13 __FILE__, __func__, __LINE__);\
14 exit(1);\
15 }while(0)
16
17 int main(int argc, const char *argv[])
18 {
19 int sockfd;
20 struct sockaddr_in groupcastaddr, addr;
21 socklen_t addrlen = sizeof(groupcastaddr);
22 char buf[N] = {};
23
24 if(argc < 3)
25 {
26 fprintf(stderr, "Usage: %s ip port
", argv[0]);
27 exit(1);
28 }
29
30 // :
31 if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
32 {
33 errlog("fail to socket");
34 }
35
36 // :
37 //inet_addr: ip
38 //htons:
39 //atoi:
40 groupcastaddr.sin_family = AF_INET;
41 groupcastaddr.sin_addr.s_addr = inet_addr(argv[1]); //224-239
42 groupcastaddr.sin_port = htons(atoi(argv[2]));
43
44 // :
45 if(bind(sockfd, (struct sockaddr *)&groupcastaddr, addrlen) < 0)
46 {
47 errlog("fail to bind");
48 }
49
50 // ,
51 struct ip_mreq mreq;
52 mreq.imr_multiaddr.s_addr = inet_addr(argv[1]);
53 mreq.imr_interface.s_addr = htonl(INADDR_ANY);
54
55 if(setsockopt(sockfd, IPPROTO_IP,\
56 IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0)
57 {
58 errlog("fail to setsockopt");
59 }
60
61 ssize_t bytes;
62 while(1)
63 {
64 if((bytes = recvfrom(sockfd, buf, N, 0,\
65 (struct sockaddr *)&addr, &addrlen)) < 0)
66 {
67 errlog("fail to recvfrom");
68 }
69 else
70 {
71 printf("ip: %s, port: %d
",\
72 inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));
73
74 printf("groupcast : %s
", buf);
75
76 }
77 }
78
79 close(sockfd);
80
81 return 0;
82 }