У меня есть машина с двумя сетевыми интерфейсами Ethernet. eno0 и eno1 . eno0 - это место, где интернет подключен, а eno1 имеет подключенное устройство Ethernet.Я получил его IP через метод Link-Local Address, и он 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-сервер.