2014-10-09 78 views
0

我已經實現了通過tcp套接字發送和接收數據的服務。現在我的機器上有兩個網絡接口,我應該通過兩個網絡運行這個服務。手動指定要發送數據的網絡接口

如何指定要發送數據的網絡接口? (使用Boost :: asio或傳統的伯克利套接字,或通過使用系統調用來動態更改內核的路由表)

+1

如果你沒有指定什麼會發生什麼? – egur 2014-10-09 12:53:44

+0

@egur對從特定子網發送的請求的響應將被髮回到錯誤的子網。 – 2014-10-09 12:57:02

+0

這強烈暗示錯誤的網絡配置。修復你的網絡配置,你不需要明確指定。 monkeypatching路由表是btw。由於內核的緩衝,這不是一個選項。 – dom0 2014-10-09 13:01:44

回答

0

我不知道關於Boost,但一般情況下,如果你想發送/ recv使用特定的接口比你需要的bind()接口的IP地址,或者在某些平臺上,你可以用setsockopt(SOL_SOCKET, SO_BINDTODEVICE)代替。

+0

這將只接收來自指定地址的連接。 – 2014-10-10 20:51:13

+0

爲什麼這會降低投票率?在特定網絡上發送/接收TCP數據的**唯一方法是將TCP套接字綁定到特定的NIC /接口。在進行出站連接時,在調用connect()之前,必須調用bind()或setsockopt(SO_BINDTODEVICE)。在接受入站連接時,它會自動綁定到任何使用的NIC /接口來接受它。你可以''將一個監聽套接字bind()'''setsockopt(SO_BINDTODEVICE)'綁定到特定的NIC /接口,或者你可以讓它綁定到所有可用的NIC /接口,它會告訴你哪一個接受了每個連接。 – 2014-10-10 22:25:16

+0

我沒有downvote,但'bind()'和'SO_BINDTODEVICE'不是同義詞。當套接字bind()到一個特定的地址時,套接字將只接收指向該地址的數據包,並且傳輸的數據包將使用該地址作爲它們的源地址。內核仍然可以通過不與地址關聯的接口來路由數據包。另一方面,當套接字使用'SO_BINDTODEVICE'時,任何發送到套接字的數據都將從關聯的接口發出,並且任何通過套接字接收的任何數據都將保證到達相關接口 。 – 2014-10-11 18:18:56

相關問題