2011-02-27 10 views
1

2つのNICを持つマシンにマルチキャストクライアントを書き込もうとしていますが、動作させることができません。私は、NIC(eth4)がマルチキャストデータグラムを受信するプログラムを起動するとスニファで見ることができますが、私のプログラムでは受信できません。複数のNICを持つC++でのマルチキャストリッスンの問題

実行している "tsharkの-i ETH4 -R udp.port == XXX(マルチキャストポート)"
は私が手:
1059.435483 y.y.y.y. (一部のIP) - > zzzz(マルチキャストIP、私のeth4 NIC IPではない)UDPソースポート:kkk(他のポート)宛先ポート:xxx(マルチキャストポート)

サンプル/説明についてはウェブを検索しましたが、みんながやることをやっているようだ。どんな助けもありがとう。 (ルート/ iptablesの/コードとは何か?)

bool connectionManager::sendMulticastJoinRequest() 
{ 
struct sockaddr_in localSock; 
struct ip_mreqn group; 

char* mc_addr_str = SystemManager::Instance()->getTCP_IP_CHT(); 
char* local_addr_str = SystemManager::Instance()->getlocal_IP_TOLA(); 
int port = SystemManager::Instance()->getTCP_Port_CHT(); 
/* Create a datagram socket on which to receive. */ 

CHT_UDP_Feed_sock = socket(AF_INET, SOCK_DGRAM, 0); 

if(CHT_UDP_Feed_sock < 0) 
{ 
    perror("Opening datagram socket error"); 
    return false; 
} 
/* application to receive copies of the multicast datagrams. */ 
{ 
    int reuse = 1; 
    if(setsockopt(CHT_UDP_Feed_sock, SOL_SOCKET, SO_REUSEADDR, (char *)&reuse, sizeof(reuse)) < 0) 
    { 
     perror("Setting SO_REUSEADDR error"); 
     close(CHT_UDP_Feed_sock); 
     return false; 
    } 
} 

/* Bind to the proper port number with the IP address */ 
/* specified as INADDR_ANY. */ 
memset((char *) &localSock, 0, sizeof(localSock)); 
localSock.sin_family = AF_INET; 
localSock.sin_port = htons(port); 
localSock.sin_addr.s_addr =inet_addr(local_addr_str); // htonl(INADDR_ANY); // 
if(bind(CHT_UDP_Feed_sock, (struct sockaddr*)&localSock, sizeof(localSock))) 
{ 
    perror("Binding datagram socket error"); 
    close(CHT_UDP_Feed_sock); 
    return false; 
} 

/* Join the multicast group mc_addr_str on the local local_addr_str */ 
/* interface. Note that this IP_ADD_MEMBERSHIP option must be */ 
/* called for each local interface over which the multicast */ 
/* datagrams are to be received. */ 

group.imr_ifindex = if_nametoindex("eth4"); 
if (setsockopt(CHT_UDP_Feed_sock, SOL_SOCKET, SO_BINDTODEVICE, "eth4", 5) < 0) 
    return false; 
group.imr_multiaddr.s_addr = inet_addr(mc_addr_str); 
group.imr_address.s_addr = htonl(INADDR_ANY); //also tried inet_addr(local_addr_str); instead 
if(setsockopt(CHT_UDP_Feed_sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&group, sizeof(group)) < 0) 
{ 
    perror("Adding multicast group error"); 
    close(CHT_UDP_Feed_sock); 
    return false; 
} 

// Read from the socket. 
char databuf[1024]; 
int datalen = sizeof(databuf); 
if(read(CHT_UDP_Feed_sock, databuf, datalen) < 0) 
{ 
    perror("Reading datagram message error"); 
    close(CHT_UDP_Feed_sock); 
    return false; 
} 
else 
{ 
    printf("Reading datagram message...OK.\n"); 
    printf("The message from multicast server is: \"%s\"\n", databuf); 
} 
return true; 
} 
+0

確かにこれはすべての単一の方法ではありませんか?確かにマルチキャストグループに参加してから、別の方法で何度も電話を受けるのですか? – EJP

+0

投稿者からの重複した質問:http://stackoverflow.com/questions/5111209/problem-in-listening-to-multicast-in-c-with-multiple-nics –

答えて

1

だけ考え、(私は、マルチキャストで多くの作業を行っていませんでした)、しかし、あなたが特定のIPアドレスに結合しているので、それは可能でしょうか?ソケットはバインドされたIPアドレス宛てのパケットのみを受け入れ、マルチキャストのものを拒否することができますか?

+0

しかし、彼は特定のIPアドレスにバインドしていません。彼はINADDR_ANYにバインドしています。 – EJP

+0

上記のコードを最後に見たとき、INADDR_ANYがある場所にlocal_addr_strがありました。それ以来、明らかに編集されています。 – Majenko

0

私はマルチキャストで遊んでいないので、しばらく前です。それを使用するにはroot/adminの権限は必要ありませんか?あなたのプログラムを起動するときにそれらを有効にしましたか?

関連する問題