2016-08-23 41 views
2

假設我從socket(2)得到了一個文件描述符,並且我已經對它做了connect(2) - 以後有什麼辦法可以確定(從正在運行的程序中)哪個網絡設備可能用於底層傳輸?在fd上調用stat(2)給出的設備號碼爲0; ioctl(2)getsockopt(2)選項都不適用。我能找到什麼網絡接口/設備處理我的套接字?

回答

0

accept調用你應該能夠得到遠程客戶端的IP地址(在Beej's上看到here)。假設您沒有任何不對稱路由,您可以在本地路由表中查找到該地址的路由。路由表應該告訴你使用什麼以太網設備將數據包發送到遠程客戶端。

編輯:

你可以使用下面的命令行工具與遠程客戶端的地址來查詢本地路由表:

ip route get <remote-client-ip-addr> 
1

有沒有萬無一失的辦法做下去 - 當然不是一個POSIX符合要求的方式。

但是,在實踐中,您可以輕鬆地確定99%的時間界面。完成connect後,使用getsockname獲取IP地址,然後查看包裝箱上可用接口的列表,找到具有匹配IP地址的接口。

+0

使用['getifaddrs()'](http://man7.org/linux/man-pages/man3/getifaddrs.3.html)檢索接口列表及其IP地址。 –

+0

另外,在Linux 3.8+中,'getsockopt()'支持'SO_BINDTODEVICE'選項,所以也可以告訴你套接字綁定到哪個接口。 –