【问题标题】:Binding to UDP socket *from* a specific IP address从特定 IP 地址绑定到 UDP 套接字 *
【发布时间】:2023-02-12 14:53:44
【问题描述】:

我有来自直接连接到我的机器的特定设备的数据包。当我执行 tcpdump -i eno3 -n -n 时,我可以看到数据包:

23:58:22.831239 IP 192.168.0.3.6516 > 255.255.255.255.6516: UDP, length 130

eno3配置为192.168.0.10/24

当我以典型方式设置套接字时:

gOptions.sockfd = socket(AF_INET, SOCK_DGRAM, 0);
memset((void *)&gOptions.servaddr, 0, sizeof(struct sockaddr_in));
gOptions.servaddr.sin_family = AF_INET;
inet_pton(AF_INET, gOptions.sourceIP, &(gOptions.servaddr.sin_addr));
gOptions.servaddr.sin_port = htons(gOptions.udpPort);
bind(gOptions.sockfd, (struct sockaddr *)&gOptions.servaddr, sizeof(struct sockaddr_in));

我在端口“6516”上使用“255.255.255.255”的sourceIP - 它连接并读取。

然而,我想要做的是绑定,这样我就限制了我与源 IP 的连接——“192.168.0.3”。我已经弄清楚如何使用该设备(“192.168.0.10”)的 iface 的任一设备名称(“eno3”)连接设备 - 但这无济于事,因为我可能有多个设备连接到“192.168. 0.10" 在该端口上的 blab,但我只想要来自 192.168.0.3 的数据包用于端口 6516。

我认为 s_addr - sin.addr 的一部分 - 是源 IP... 但事实并非如此。

【问题讨论】:

标签: sockets udp


【解决方案1】:

您不能 bind() 到外部 IP/端口,只能到本地 IP/端口。因此,对于您所描述的内容,您需要将bind()发送到数据包发送到的IP/端口(192.168.0.10:6516),并将connect()发送到数据包发送的IP/端口(192.168.0.3:6516)。然后你可以使用recv()(而不是recvfrom()),你将只收到属于那对特定端点的数据包。

【讨论】:

    猜你喜欢
    • 2014-05-27
    • 1970-01-01
    • 1970-01-01
    • 2014-05-31
    • 1970-01-01
    • 2021-01-20
    • 2012-06-15
    • 2012-05-26
    • 2012-03-14
    相关资源
    最近更新 更多