2012-02-11 13 views
6

単一のソケットで複数のマルチキャストグループからデータを受信することはできますか?例えば1つのソケットで複数のマルチキャストグループを購読する(Linux、C)

:私は1つのマルチキャストグループを追加するとき

void AddGroup(int sock, 
       const char* mc_addr_str, 
       int mc_port, 
       const char* interface) { 
    struct sockaddr_in mc_addr; 
    memset(&mc_addr, 0, sizeof(mc_addr)); 
    mc_addr.sin_family  = AF_INET; 
    mc_addr.sin_addr.s_addr = inet_addr(mc_addr_str); 
    mc_addr.sin_port  = htons(mc_port); 

    if ((bind(sock, (struct sockaddr *) &mc_addr, 
      sizeof(mc_addr))) < 0) { 
    perror("bind() failed"); 
    exit(1); 
    } 

    // construct an IGMP join request structure 
    struct ip_mreq mc_req; 
    mc_req.imr_multiaddr.s_addr = inet_addr(mc_addr_str); 
    mc_req.imr_interface.s_addr = inet_addr(interface); 

    if ((setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, 
        (void*) &mc_req, sizeof(mc_req))) < 0) { 
    perror("setsockopt() failed"); 
    exit(1); 
    } 
} 

このコードは動作します。しかし、別のものを追加しようとすると、「バインド」が失敗します。なぜ私はバインドが最初にそこにある必要があるのか​​よく分かりません。 (しかしコードはそれなしでは動作しません)。

理想的には、同じソケットで複数回AddGroupを呼びたいと思います。これは可能ですか?または、グループごとに1つのソケットが必要ですか?そしてポーリングだけを使用しますか?

答えて

3

ソケットは1回のみバインドします。 2回目のバインドをスキップし、何が起こるかを見てください。

-3

特定のソケットに複数のマルチキャストグループを参加させることはできません。ソケットは、ソースip/portと宛先ip/portの組み合わせによって定義されます。オペレーティングシステムは、2番目のip/portから送信されるデータの処理方法を知りません。なぜなら、送信するソケットがないからです。

このバインドは、オペレーティングシステムとの接続を登録するために必要です。基本的にファイルハンドルの登録に似ています。

これを行う最善の方法は、各マルチキャストグループのソケットを作成し、次にselect()を呼び出すことです。 select()は、読み込みの準備ができているデータがあるソケットがあれば通知します。

socket()、bind()、select()の詳細については、マニュアルページを参照してください。

+2

あなたは間違っています。あなたは好きなだけ多くのグループに参加できます。マルチキャストグループへの参加は、タプルの識別には関係ありません。 – EJP

6

bind()ではなく、IP_ADD_MEMBERSHIPオプションを使用して適切なsetsockopt()コールを使用して、任意の数のマルチキャストグループに参加できます。

+0

AddGroupへの後続の呼び出しで「バインド」を削除すると、最初のマルチキャストグループだけが「購読済み」になっているようです。 – Switch

+0

@SwitchデフォルトのIPルート経由でグループにアクセスできない場合は、グループに参加するときに適切な送信ローカルアドレスを指定する必要があります。そのため、「メンバーシップの追加」IGMPメッセージは適切な方向に進みます。 – EJP

2

bindを受動アドレスに、つまりIPv4では0.0.0.0に、ASMまたはSSMを使用して追加のグループを取得します。 IP_ADD_MEMBERSHIPが挙げられる。

bindは1回のみ可能です。

2

単一のソケットに複数のマルチキャストグループを参加できます。データを読み取っているマルチキャストグループを認識する方法については、setsockopt()、IP_PKTINFOを参照してください。

0

はい、それは可能です:いくつかの手順でこれを短縮するためのリンク(http://www.tenouk.com/Module41c.html) 例に見て:あなたはSO_REUSEADDR

  • でSETSOCKOPT

    1. あなたはINADDR_ANY
    2. にバインドしますsetsockoptにIP_ADD_MEMBERSHIPを指定し、データグラムを受信するすべてのグループに適用します。
    3. IP_PKTINFOを使用すると、受信したパケットを区別するためのオプションを与えるように私には見えますが、送信者がそれら(Setting the source IP for a UDP socket)を調製気をつけなければなりません
  • 関連する問題