2010-09-24 50 views
4

我試圖接受在CentOS 5.5接收來自特定的網絡接口的多播在Linux上

sd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); 
memset(&addr, 0, sizeof(addr)); 
addr.sin_family = AF_INET; 
addr.sin_port = htons(1234); 
addr.sin_addr.s_addr = htonl(INADDR_ANY); 
bind(sd, (sockaddr*)&addr, sizeof(sockaddr_in)); 
setsockopt(sd, SOL_SOCKET, SO_BINDTODEVICE, "eth0", 5); 

從特定的網絡接口的多播數據,但我收到來自所有接口的數據包。

有什麼不對?

+0

不應該是'setsockopt(sd,SOL_SOCKET,SO_BINDTODEVICE,「eth0」,4);'? (注意4 vs 5)。 – 2010-09-24 21:43:17

+0

我試過setsockopt(sd,SOL_SOCKET,SO_BINDTODEVICE,「eth0」,4),但setsockopt()失敗。我認爲(不確定)5是否包括終止零點。 – Dima 2010-09-24 21:45:00

回答

5

首先,在這種情況下,檢查是否有任何呼叫失敗,套接字,綁定,setsockopt。使用perror()函數打印錯誤消息將有助於您診斷問題。

然而,對於接收多播數據包,您可能需要當你使用IP_ADD_MEMBERSHIP套接字選項 喜歡的東西

setsockopt (sd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)); 

其中mreq結構是

加入組播組指定接口的IP地址
struct ip_mreq 
{ 
     struct in_addr imr_multiaddr; /* IP multicast address of group */ 
     struct in_addr imr_interface; /* local IP address of interface */ 
}; 

更多信息here

+0

我根據你改變了ADD_MEMBERSHIP。 結果是一樣的:我仍然接收來自其他接口的多播。 順便說一句,在我真正的代碼中,我正在檢查所有API的返回值。 謝謝, Dima – Dima 2010-09-24 22:26:06

+0

這是我的錯誤,您的解決方案正在工作! 謝謝,迪馬 – Dima 2010-09-25 19:59:58

相關問題