如何使用UdpSocket通过特定的网络接口进行发送?

时间:2018-06-23 13:08:00

标签: networking rust network-programming udp

我的机器有两个以太网接口。 eno0 eno1 eno0 是插入Internet的地方, eno1 具有已连接的以太网设备。我通过链接本地地址方法获得了它的IP,它是168.254.80.23。我想将数据包发送到端口5000。

我想使用Rust的UdpSocket连接到该地址和给定的端口并发送一些数据包。在变量buf_with_message中已经正确描述了一个这样的数据包:

let sock = UdpSocket::bind("0.0.0.0:0"); //Let system assign me an ip and port
sock.connect(("168.254.80.23",5000)); // Connect to device ip and pre-designated port 5000
sock.send(&buf_with_message).unwrap(); //Send the packet

该连接按应有的方式发生,但是数据包是通过 eno0 而不是 eno1 发送的。我不知道如何指定它应该使用的接口。我找到了一些答案,可以使用C SO_BINDTODEVICE来做到这一点。

我还尝试通过

为接口分配IP
sudo ifconfig eno1 192.0.2.10

,然后将0.0.0.0中的UdpSocket::bind地址更改为该新地址,没有任何积极结果。

我看到了使用pnet板条箱直接进入原始套接字的潜在解决方案,但我认为这会过分杀人。

我知道RFC 3927会针对具有多个接口的主机发出警告,但是在不放弃LLA并实现DHCP服务器的情况下,我找不到其他选择。

1 个答案:

答案 0 :(得分:0)

我已经启动了DHCP服务器,并且正在通过DHCP提供的IP进行通信。我不知道为什么LLA分配的IP在DHCP起作用时不起作用,但现在可以起作用。