2013-11-26 83 views
0

對於一個具體的例子,假設在同一個端口上有2個播播IP(ip1,ip2)。我想運行兩個不同的進程,一個監聽ip1(而不是ip2),另一個監聽ip2(而不是ip1)。所以我在其他進程中調用了(ip1,port)和(ip2,port),而不是((INADDR_ANY,port)。
原則上這很好,但假設沒有2個ips,但有100個IP我最終創建了100個UDP套接字,現在我的進程無法處理好,我看到很多數據包丟失。
基本上,如果我簡單地綁定到(INADDR_ANY,端口),然後多播加入50個IP,它可以正常工作但是如果我創建50個不同的套接字,那麼它不會
是否預期?通配符綁定比特定的地址更有效或性能下降是因爲現在有太多的套接字,現在選擇和輪詢的事情需要很多的時間嗎?
有沒有什麼辦法,我不需要創建這麼多的套接字和進程也沒有得到其他進程s的數據?收聽端口上的選播組播組

+0

可能重複[在同一端口上接收多個多播源 - C,Linux](http://stackoverflow.com/questions/2741611/receving-multiple-multicast-feeds-on-the-same-port-c -linux) – mpromonet

回答

0

我猜你決定,因爲你使用的是Linux具有不同的行爲和別人比較OS一樣的FreeBSD或Windows使用綁定的解決方法(見https://bugzilla.redhat.com/show_bug.cgi?id=231899

隨着現代內核(因爲2.6.31)它可以要求只接收正在重置的選項IP_MULTICAST_ALL(see manpage ip(7))的預訂的多播組:

int mc_all = 0; 
    if ((setsockopt(sock, IPPROTO_IP, IP_MULTICAST_ALL, (void*) &mc_all, sizeof(mc_all))) < 0) { 
    perror("setsockopt() failed"); 
    } 

我從來沒有經歷過的結合影響插座的表現,不過你可以試試這個選項,並綁定上INADDR_ANY。也許這會幫助你的表現?