UDPマルチキャストの送信と受信コードの例


マルチキャストパケットの送受信は依然としてUDPソケットによって実現される.マルチキャストパケット送信の流れを以下に示す.(1)UDPソケットを作成する.(2)宛先アドレスとポートを指定する.(3)パケットを送信する.
  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 }