Как использовать UdpSocket для отправки с использованием определенного сетевого интерфейса? - PullRequest
0 голосов
/ 23 июня 2018

У меня есть машина с двумя сетевыми интерфейсами 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-сервер.

1 Ответ

0 голосов
/ 07 июля 2018

Я запустил сервер DHCP, и я общаюсь по IP, который предоставляется через DHCP. Я понятия не имею, почему назначенный LLA IP не работает, когда DHCP работает, но пока работает.

...