Могу ли я узнать, какой сетевой интерфейс / устройство обрабатывает мой сокет?

Скажем, у меня есть дескриптор файла от 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>
Другие вопросы по тегам