マルチキャスト
マルチキャストは特定のグループのメンバーにだけ送信する。この集合をマルチキャストグループといい、受信をしたい人はこのグループに登録する必要がある。IP にはマルチキャスト用に用意されたアドレスの範囲があるためその中から任意のものを宛先に指定することが必要。
マルチキャストに用意されたアドレスの範囲は下記の通りです。
224.0.0.0 - 239.255.255.255
■以下のコマンドを使って、Listing group memberships
1)クライアントのソースコードを組みましょう。
void main()
{
WSADATA wsaData;
WSAStartup(MAKEWORD(2,0), &wsaData);
// UDP 用のソケット作成
SOCKET sock = socket(AF_INET, SOCK_DGRAM, 0);
// マルチキャストグループを宛先に指定する
struct sockaddr_in adr;
adr.sin_family = AF_INET;
adr.sin_port = htons(7777);
adr.sin_addr.S_un.S_addr = inet_addr( "224.1.2.3" );
int param = 1;
if ( setsockopt(sock, IPPROTO_IP, IP_MULTICAST_TTL, (const char *), sizeof(param) ) < 0 ){
printf( "setsockopt fail\n" );
}
else {
printf( "setsockopt success\n" );
}
// POINT
// 3 秒ごとに指定した特定のネットワークにマルチキャストする
while(1) {
printf( "multicast message 送信\n" );
char buf[] = "test multicast";
int len = sizeof(adr);
// 他のソケットが使用していないポート番号が自動で設定される。
// サーバはこのポートを見て返事を返すので特に知る必要はない
sendto( sock, buf, strlen(buf), 0, (struct sockaddr *)&adr, len );
Sleep(1000 * 3);
}
}
2)サーバー側のプログラムを組みましょう。
#include < winsock2.h>
#include < ws2tcpip.h>
#pragma comment(lib, "ws2_32.lib")
// サーバーソケットを作成する
SOCKET createServerSocket( unsigned short port )
{
SOCKET sock = socket(AF_INET, SOCK_DGRAM, 0);
struct sockaddr_in adr;
adr.sin_family = AF_INET;
adr.sin_port = htons(port);
adr.sin_addr.S_un.S_addr = INADDR_ANY; // サーバ側で割り当てられている IP を自動で設定
bind(sock, (struct sockaddr *)&adr, sizeof(adr));
return sock;
}
void main()
{
WSADATA wsaData;
WSAStartup(MAKEWORD(2,0), &wsaData);
SOCKET sock = createServerSocket( 7777 );
// マルチキャストグループへ登録( join )する
struct ip_mreq mr;
mr.imr_multiaddr.s_addr = inet_addr( "224.1.2.3" );
mr.imr_interface.s_addr = INADDR_ANY;
if ( setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (const char *)&mr, sizeof(mr) ) < 0 ){
printf( "setsockopt fail\n" );
}
else {
printf( "setsockopt success\n" );
}
while(1) {
struct sockaddr_in adr;
int len = sizeof(adr);
// 移行のクライアントとの対話を普通にすると当然 recv などでブロックされる。
char buf[256];
printf( "recvfrom にはいります\n" );
int n = recvfrom( sock, buf, sizeof(buf), 0, (struct sockaddr *)&adr, &len );
buf[ n ] = '\0';
printf( "multicast msg %s\n", buf );
}
}
通信出来ないについて、ファイアウォールは最大の原因と考えています。
参考:http://tip.sakura.ne.jp/htm/net_chp1frame.htm
マルチキャストは特定のグループのメンバーにだけ送信する。この集合をマルチキャストグループといい、受信をしたい人はこのグループに登録する必要がある。IP にはマルチキャスト用に用意されたアドレスの範囲があるためその中から任意のものを宛先に指定することが必要。
マルチキャストに用意されたアドレスの範囲は下記の通りです。
224.0.0.0 - 239.255.255.255
■以下のコマンドを使って、Listing group memberships
1)クライアントのソースコードを組みましょう。
void main()
{
WSADATA wsaData;
WSAStartup(MAKEWORD(2,0), &wsaData);
// UDP 用のソケット作成
SOCKET sock = socket(AF_INET, SOCK_DGRAM, 0);
// マルチキャストグループを宛先に指定する
struct sockaddr_in adr;
adr.sin_family = AF_INET;
adr.sin_port = htons(7777);
adr.sin_addr.S_un.S_addr = inet_addr( "224.1.2.3" );
int param = 1;
if ( setsockopt(sock, IPPROTO_IP, IP_MULTICAST_TTL, (const char *), sizeof(param) ) < 0 ){
printf( "setsockopt fail\n" );
}
else {
printf( "setsockopt success\n" );
}
// POINT
// 3 秒ごとに指定した特定のネットワークにマルチキャストする
while(1) {
printf( "multicast message 送信\n" );
char buf[] = "test multicast";
int len = sizeof(adr);
// 他のソケットが使用していないポート番号が自動で設定される。
// サーバはこのポートを見て返事を返すので特に知る必要はない
sendto( sock, buf, strlen(buf), 0, (struct sockaddr *)&adr, len );
Sleep(1000 * 3);
}
}
2)サーバー側のプログラムを組みましょう。
#include < winsock2.h>
#include < ws2tcpip.h>
#pragma comment(lib, "ws2_32.lib")
// サーバーソケットを作成する
SOCKET createServerSocket( unsigned short port )
{
SOCKET sock = socket(AF_INET, SOCK_DGRAM, 0);
struct sockaddr_in adr;
adr.sin_family = AF_INET;
adr.sin_port = htons(port);
adr.sin_addr.S_un.S_addr = INADDR_ANY; // サーバ側で割り当てられている IP を自動で設定
bind(sock, (struct sockaddr *)&adr, sizeof(adr));
return sock;
}
void main()
{
WSADATA wsaData;
WSAStartup(MAKEWORD(2,0), &wsaData);
SOCKET sock = createServerSocket( 7777 );
// マルチキャストグループへ登録( join )する
struct ip_mreq mr;
mr.imr_multiaddr.s_addr = inet_addr( "224.1.2.3" );
mr.imr_interface.s_addr = INADDR_ANY;
if ( setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (const char *)&mr, sizeof(mr) ) < 0 ){
printf( "setsockopt fail\n" );
}
else {
printf( "setsockopt success\n" );
}
while(1) {
struct sockaddr_in adr;
int len = sizeof(adr);
// 移行のクライアントとの対話を普通にすると当然 recv などでブロックされる。
char buf[256];
printf( "recvfrom にはいります\n" );
int n = recvfrom( sock, buf, sizeof(buf), 0, (struct sockaddr *)&adr, &len );
buf[ n ] = '\0';
printf( "multicast msg %s\n", buf );
}
}
通信出来ないについて、ファイアウォールは最大の原因と考えています。
参考:http://tip.sakura.ne.jp/htm/net_chp1frame.htm
コメント
このブログにコメントするにはログインが必要です。
さんログアウト
この記事には許可ユーザしかコメントができません。