gpt4 book ai didi

C - 为 UDP/多播套接字选择接口(interface)

转载 作者:太空狗 更新时间:2023-10-29 16:34:07 24 4
gpt4 key购买 nike

我正在尝试修改 multicast listener / sender example将 UDP/多播套接字绑定(bind)到特定接口(interface),使用INADDR_ANY宏。

我有接口(interface)的IPv4地址。我尝试了以下操作,但套接字没有收到任何 UDP(单播、广播、多播)数据包。

struct sockaddr_in addr;
int fd, nbytes;
socklen_t addrlen;
struct ip_mreq mreq;

// my_ipv4Addr equals current IP as String, e.g. "89.89.89.89"

// create what looks like an ordinary UDP socket */
if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
perror("socket");
exit(1);
}

// set up addresses
bzero(&addr, sizeof(addr));
addr.sin_family = AF_INET;
// [-] addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_addr.s_addr = inet_addr(my_ipv4Addr);
addr.sin_port = htons(port);

// bind socket
if (bind(fd, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
perror("bind");
exit(1);
}

// use setsockopt() to request that the kernel join a multicast group
mreq.imr_multiaddr.s_addr = inet_addr(group);
// [-] mreq.imr_interface.s_addr = htonl(INADDR_ANY);
mreq.imr_interface.s_addr = inet_addr(my_ipv4Addr);
if (setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq))< 0) {
perror("setsockopt");
exit(1);
}

编辑:

让我解释一下我的程序的目的。 我正在编写一个小工具,它将检查网络是否支持广播/多播。因此我拥有一个具有两个接口(interface)的系统并通过 Interface1 发送一个多播数据包并尝试使用 Interface2 接收它。但是:数据包应该通过网络,而不是 loopack 设备。

想法是通过以下方式阻止 thread1/interface1 上的多播环回:

u_char loop = 0;
setsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP, &loop, sizeof(loop));

并监听 thread2/interface 2 interface-specific。 Tcpdump 显示数据包已到达,但在我上面的配置中被丢弃了。

最佳答案


addr.sin_addr.s_addr=inet_addr(my_ipv4Addr);
bind(sockfd,(SA*)&addr,sizeof(addr));
你只能向多播组发送数据包,
但是你无法接收任何数据包,即使是那些从“my_ipv4Addr”发出的数据包。

所以 addr.sin_addr.s_addr 必须是 htonl(INADDR_ANY)


mreq.imr_interface.s_addr=inet_addr(my_ipv4Addr);
你可以从多播组接收所有数据包,
但它使用默认接口(interface)(可能是 eth0)发送数据包,
不是您指定的那个(例如 eth1)。
所以这是没有效果的。


setsockopt(sockfd,SOL_SOCKET,SO_BINDTODEVICE,ETH1,strlen(ETH1));
您可以通过接口(interface) ETH1 发送数据包,
但是你只能接收从与ETH1关联的ip发出的数据包,
您无法从其他客户端接收任何数据包。


mreq.imr_interface.s_addr=inet_addr(my_ipv4Addr);
setsockopt(sockfd,IPPROTO_IP,IP_MULTICAST_IF,&mreq.imr_interface,sizeof(struct in_addr);
您可以通过与 my_ipv4addr 关联的接口(interface)发送数据包,
您还可以从多播组中的任何客户端接收任何数据包。

关于C - 为 UDP/多播套接字选择接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12681097/

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