2010-09-24 66 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

相关问题