2011-11-03 49 views
0

我寫了一個小型應用程序,需要通過機器上的多個網絡接口之一進行連接。該界面不是「默認」界面(具有默認路徑的界面)。是否可以將出站TCP套接字直接綁定到特定接口?跳過傳出連接的默認路由

下面是一個例子:

eth0: 192.168.1.10, gateway 192.168.1.1 
eth1: 192.168.2.10, gateway 192.168.2.1 
default gateway: 192.168.1.1 
(both interfaces can reach the Internet through different external IPs) 

現在,我想我用eth1應用程序連接到外部服務器,即使系統被配置爲使用eth0的外部流量。

(問題可能是微不足道的,但我只是想知道是否有可能在所有花費時間之前)

目前,我正在使用Python與扭曲,但如果我必須使用BSD套接字那麼就這樣吧。

+0

將套接字綁定到特定的接口(或至少一個特定的IP地址)是相當簡單的 - 結果是套接字只能建立可以路由到該IP地址的連接..但是,你的意思是「但我想通過互聯網使用該網關」?哪個網關? – nos

+0

我編輯了我的問題以進行澄清,請參閱最新的問題。謝謝! – Krumelur

+0

路由是在OS TCP/IP堆棧級完成的,而不是在Socket API級別完成的,因此,基本上,在您的配置中,系統不知道如何通過eth1訪問Internet。您可以在操作系統級別啓用多個默認網關(http://kindlund.wordpress.com/2007/11/19/configuring-multiple-default-routes-in-linux/),在這種情況下,套接字API應該使用它(但我從來沒有用過這樣的設置,所以不能向你保證) –

回答

0

來源:http://linux.about.com/od/commands/l/blcmdl7_socket.htm

SO_DONTROUTE - 不要通過網關發送,只發送到直接連接的主機。通過在套接字send(2)操作上設置MSG_DONTROUTE標誌可以實現同樣的效果。期望一個整數布爾標誌。

+0

我知道SO_DONTROUTE,但我想連接到Internet上的服務器,而不是本地局域網段。 – Krumelur