На каком адаптере я только что получил этот пакет UDP?
Я пытаюсь написать BOOTP-сервер в C#.
Я получаю и анализирую пакет BOOTP от клиента, и мне нужно ответить с IP-адресом моего сервера.
Проблема в:
- Компьютер может иметь несколько сетевых адаптеров
- У клиента еще нет IP-адреса
Есть ли способ узнать, на какой адаптер был получен пакет UDP?
1 ответ
Есть несколько возможных способов сделать это. Свяжите отдельный сокет на каждом IP на каждом физическом интерфейсе, тогда вы всегда будете знать, на какой интерфейс поступил пакет. Вы также можете попробовать флаг IP_RECVIF вместе с функцией сокета recvmsg, хотя я не знаю, поддерживается ли это в Windows. У Стивена есть примеры в Разделах 22.2 и 22.6 Сетевого Программирования Unix. Вы можете использовать флаг SIOCGIFCONF с ioctl, чтобы получить список интерфейсов на машине. В разделе 17.6 UNP приведен пример программы. Если C# не предоставляет вам доступ к этим функциям, но они поддерживаются в Windows, вы можете написать простую программу на C для сбора и обновления информации об интерфейсе / IP, а затем использовать mmap для разделения области памяти между вашей программой на C# и перечислителем интерфейса.