【问题标题】:receive multicast from specific network interface on Linux从 Linux 上的特定网络接口接收多播
【发布时间】:2011-04-17 00:16:00
【问题描述】:

我正在尝试从 CentOS 5.5 上的特定网络接口接收多播数据

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);

但我正在从所有接口接收数据包。

怎么了?

【问题讨论】:

  • 不应该是setsockopt(sd, SOL_SOCKET, SO_BINDTODEVICE, "eth0", 4);吗? (注意 4 对 5)。
  • 我尝试了 setsockopt(sd, SOL_SOCKET, SO_BINDTODEVICE, "eth0", 4),但是 setsockopt() 失败了。我认为(不确定)5 包括终止零。

标签: linux networking multicast multicastsocket


【解决方案1】:

首先,检查是否有任何调用失败,在这种情况下是 socket、bind、setsockopt。使用 perror() 函数打印错误消息将帮助您诊断问题。

但是,为了接收多播数据报,您可能需要在使用 IP_ADD_MEMBERSHIP 套接字选项加入多播组时指定接口的 IP 地址 像

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

mreq 结构在哪里

struct ip_mreq
{
        struct in_addr imr_multiaddr;   /* IP multicast address of group */
        struct in_addr imr_interface;   /* local IP address of interface */
};

更多信息here

【讨论】:

  • 我根据你更改了 ADD_MEMBERSHIP。结果是一样的:我仍然从其他接口接收多播。顺便说一句,在我的真实代码中,我正在检查所有 API 的返回值。谢谢,迪玛
猜你喜欢
  • 2021-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-08
  • 1970-01-01
  • 2012-11-30
  • 1970-01-01
相关资源
最近更新 更多