對於一個具體的例子,假設在同一個端口上有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
A
回答
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。也許這會幫助你的表現?
相關問題
- 1. 偵聽組播報所有接口上
- 2. Erlang:在同一個端口上接收多個組播流
- 3. 在收聽特定端口時收到廣播的數據包
- 4. IPv6的組播偵聽在Linux上
- 5. 組播偵聽同一個主機和端口C
- 6. 接收來自不同端口的組播
- 7. 收聽UDP廣播
- 8. 嘗試收聽C#組播組時發生UnauthorizedAccessException錯誤winRT
- 9. C# - 組播Socket.RecieveFrom:能端口0
- 10. 如何接收組播UDP?
- 11. 組播與選擇
- 12. 如何在c linux中的特定接口上收聽廣播?
- 13. 扭曲的Python:UDP組播接口和組
- 14. 在特定接口上接收組播數據
- 15. 收聽多播UDP地址
- 16. 如何監聽任何端口上的廣播數據包?
- 17. 收聽UDP端口
- 18. 收聽端口5060
- 19. 的boost ::短耳組播監聽地址
- 20. 收聽機器上的每個端口
- 21. 活動收聽廣播接收器
- 22. Android 2.2上的組播
- 23. 收聽所有的端口
- 24. 端口的收聽能力
- 25. 任何接收指定UDP端口組播數據包的小程序?
- 26. 選擇組播IP地址
- 27. 組播接收器程序的優化
- 28. 在多個端口上收聽
- 29. 廣播接收器收聽文本選擇
- 30. 數組播放與播放
可能重複[在同一端口上接收多個多播源 - C,Linux](http://stackoverflow.com/questions/2741611/receving-multiple-multicast-feeds-on-the-same-port-c -linux) – mpromonet