gpt4 book ai didi

sockets - 使用接口(interface)名称设置 IP_MULTICAST_IF 时 sendto 中的参数无效

转载 作者:行者123 更新时间:2023-12-02 16:27:07 27 4
gpt4 key购买 nike

我正在编写一个发送和接收多播数据包的小程序。我需要使用其名称(例如 eth0)而不是其地址来设置传出接口(interface)。因此,我必须使用 struct ip_mreqn (而不是 struct in_addr),以便我可以使用其 imr_ifindex 字段来设置接口(interface)索引(我可以使用接口(interface)的名称来获取)。

但是由于某种原因它不起作用。对setsockopt() 的调用工作正常,但以下对sendto() 的调用返回“无效参数”错误。当然,如果我用 in_addr 替换 ip_mreqn 并改用接口(interface)地址,错误就会消失。

以下是我的代码:

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有什么问题吗?有人知道吗?非常感谢帮助。谢谢。

请注意,目标端口和地址已经采用网络字节顺序。

最佳答案

来自tldp's multicast howto :

Usually, the system administrator specifies the default interface multicast datagrams should be sent from. The programmer can override this and choose a concrete outgoing interface for a given socket with this option.

struct in_addr interface_addr;
setsockopt (socket, IPPROTO_IP, IP_MULTICAST_IF, &interface_addr, sizeof(interface_addr));

根据他们的说法,仅仅接口(interface)的索引是不够的。

编辑:
您可能会将 IP_MULTICAST_IFIPV6_MULTICAST_IF 混淆,后者采用无符号整数来表示接口(interface)编号(请参阅 man 7 ipv6 )。

编辑:
事实证明,给出的示例按预期工作。这是我的完整测试用例:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <net/if.h>
#include <arpa/inet.h>
#include <sys/socket.h>


int main()
{
int sd = socket(AF_INET, SOCK_DGRAM, 0);
struct sockaddr_in sa = {0};
struct ip_mreqn addr = {{0}};
char msg[] = "abc";

addr.imr_ifindex = if_nametoindex("eth0");
setsockopt(sd, IPPROTO_IP, IP_MULTICAST_IF, &addr, sizeof(addr));

sa.sin_family = AF_INET;
sa.sin_port = 8653;

inet_pton(AF_INET, "224.255.255.5", &sa.sin_addr);
if (sendto(sd, msg, sizeof(msg), 0, (void*)&sa, sizeof(sa)) < 0) {
perror("bugger");
return 1;
}
return 0;
}

关于sockets - 使用接口(interface)名称设置 IP_MULTICAST_IF 时 sendto 中的参数无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10993944/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com