2016年10月5日 星期三

[python] TCP socket連線時,指定要使用網卡IP

最近在Linux的設備上遇到有二個網路介面的情形,一個是Ethernet,一個是3G
如果二個介面都可以上網,就會由系統自動選一條路走
但如果要自己選擇呢?
比如說
Ethernet為192.168.0.3
3G網路上101.138.125.192

這時要走3G就這樣做
s3 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s3.bind(("101.138.125.192", 0))
s3.connect(("www.google.com", 80))
s3.sendall("abcd")

要走ethernet就這樣做
s4 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s4.bind(("192.168.0.3", 0))
s4.connect(("www.google.com", 80))
s4.sendall("abcd")

若是依之前的寫法,沒有特別去bind,就會依目前routting的路去走,我的系統預設是走ethernet,因此如果是自己架的Server,就會看到是由Ethernet出來的ip
s5 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s5.connect(("www.google.com", 80))
s5.sendall("abcd")

另外,如果不知道目前eth0和3G的ppp0的IP的由,可以用ipconfig, ifconfig指令取得介面的IP資料,再來指令要bind的IP,就可以解決了

沒有留言:

張貼留言