UDPでマルチキャストを使う(マルチキャスト送信)

ここでは、UDPソケットでマルチキャストパケットを送る方法を説明します。

マルチキャスト送信サンプル

まずは、マルチキャストを送信するサンプルを以下に示します。


#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

int
main()
{
 int sock;
 struct sockaddr_in addr;
 in_addr_t ipaddr;

 sock = socket(AF_INET, SOCK_DGRAM, 0);

 addr.sin_family = AF_INET;
 addr.sin_port = htons(12345);
 addr.sin_addr.s_addr = inet_addr("239.192.1.2");
 addr.sin_len = sizeof(addr);

 ipaddr = inet_addr("127.0.0.1");
 if (setsockopt(sock,
		IPPROTO_IP,
		IP_MULTICAST_IF,
		(char *)&ipaddr, sizeof(ipaddr)) != 0) {
	perror("setsockopt");
	return 1;
 }

 sendto(sock, "HELLO", 5, 0, (struct sockaddr *)&addr, sizeof(addr));

 close(sock);

 return 0;
}

上記例のようにsetsockoptを行わなくても、struct sockaddr_inに設定する宛先をマルチキャストアドレスにするだけでマルチキャストパケットの送信は行えます。 ただし、複数インターフェースがある機器では出力インターフェースを指定しないと意図しないインターフェースからマルチキャストパケットが出てしまいます。 そのため、面倒でもIP_MULTICAST_IFは設定しておくことをお勧めいたします。 IP_MULTICAST_IFで特定のネットワークインターフェースを指定するには、そのネットワークインターフェースに設定されたIPアドレスを利用します。 上記例では、127.0.0.1(ローカルホスト)というネットワークインターフェースを指定しています。