Могу ли я узнать, какой сетевой интерфейс / устройство обрабатывает мой сокет?
Скажем, у меня есть дескриптор файла от socket(2)
и я сделал connect(2)
на нем - есть ли способ позже определить (изнутри работающей программы), какое сетевое устройство может использоваться для основного транспорта? Вызов stat(2)
на фд дает номер устройства 0; ни один из ioctl(2)
или же getsockopt(2)
варианты кажутся применимыми.
2 ответа
Нет никакого надежного способа сделать это - конечно, не посикс-совместимый способ.
Однако на практике вы можете легко определить интерфейс в 99% случаев. После того как вы сделали connect
использовать getsockname
чтобы получить IP-адрес, просмотрите список доступных интерфейсов на коробке для одного с соответствующим IP-адресом.
От accept
Позвоните, вы должны быть в состоянии получить IP-адрес удаленного клиента (см. здесь на Beej's). Предполагая, что у вас нет асимметричных маршрутов, вы можете найти маршрут к этому адресу в вашей локальной таблице маршрутизации. В таблице маршрутизации должно быть указано, какое устройство Ethernet используется для отправки пакетов удаленному клиенту.
РЕДАКТИРОВАТЬ:
Вы можете использовать следующий инструмент командной строки для запроса вашей локальной таблицы маршрутизации с адресом удаленного клиента:
ip route get <remote-client-ip-addr>