我正在编写一个发送和接收多播数据包的小程序。我需要使用其名称(例如 eth0)而不是其地址来设置传出接口。因此我必须使用 struct ip_mreqn(而不是 struct in_addr),以便我可以使用它的 imr_ifindex 字段来设置接口索引(我可以使用接口的名称来获取)。
但是由于某种原因它不起作用。对 setsockopt() 的调用工作正常,但对 sendto() 的以下调用返回“无效参数”错误。当然,如果我用 in_addr 替换 ip_mreqn 并改用接口的地址,错误就会消失。
以下是我的代码:
sd = socket(AF_INET, SOCK_DGRAM, 0);
struct ip_mreqn addr;
addr.imr_ifindex = if_nametoindex("eth0");
setsockopt(sd, IPPROTO_IP, IP_MULTICAST_IF, &addr, sizeof(addr);
struct sockaddr_in sock_addr;
memset((char *) &sock_addr, 0, sizeof(sock_addr));
sock_addr.sin_family = AF_INET;
sock_addr.sin_port = destination_port;
sock_addr.sin_addr.s_addr = destination_address;
char msg[] = "abc";
while (sendto(sd, msg, sizeof(msg), 0, reinterpret_cast<const sockaddr*>(&sock_addr),
sizeof(sock_addr)) < 0)
throw std::runtime_error(strerror(errno));
设置 IP_MULTICAST_IF 时使用 struct ip_mreqn 有什么问题吗?有人知道吗?非常感谢帮助。谢谢。
请注意,目标端口和地址已经按网络字节顺序排列。