2011-11-23 34 views
6

Tôi có đoạn mã sau:python: urllib2 sử dụng giao diện mạng khác nhau

f = urllib2.urlopen(url) 
data = f.read() 
f.close() 

Nó đang chạy trên máy tính có hai giao diện mạng. Tôi muốn chỉ định giao diện nào tôi muốn sử dụng mã. Cụ thể, tôi muốn nó sử dụng cái khác với cái mà nó đang sử dụng theo mặc định ... nhưng tôi có thể tìm ra cái nào nếu tôi chỉ có thể chọn giao diện.

Cách dễ nhất/tốt nhất/nhiều nhất để làm điều này là gì?

+0

Tôi giả sử bạn không thể thay đổi giá trị tuyến đường hệ thống để buộc kết nối với máy chủ từ xa của bạn sử dụng giao diện khác? –

+0

@ CédricJulien: Điều đó sẽ hoạt động (nếu tôi có thể thực hiện tất cả các kết nối đến một trang web cụ thể đi qua giao diện khác), mặc dù tôi cũng quan tâm để biết cách làm điều đó trong mã nếu có thể. – Claudiu

Trả lời

3

Chưa một giải pháp hoàn chỉnh, nhưng nếu bạn đang sử dụng chỉ đối tượng ổ cắm đơn giản, bạn có thể làm những gì bạn cần theo cách này:

import socket 
s = socket.socket() 
s.bind(("127.0.0.1", 0)) # replace "127.0.0.1" by the local IP of the interface to use 
s.connect(("remote_server.com", 80)) 

Vì vậy, bạn sẽ buộc hệ thống để ràng buộc các ổ cắm đến muốn giao diện mạng.

+0

Nếu bạn đang sử dụng Linux, [công thức] này (http://code.activestate.com/recipes/439094-get-the-ip-address-associated-with-a-network-inter/) sẽ hữu ích đối với ánh xạ từ tên giao diện đến địa chỉ IP. – jcollado

2

Nếu bạn sử dụng Twisted của twisted.web.client.Agent, sau đó bạn có thể đạt được điều này thông qua:

from twisted.internet import reactor 
from twisted.web.client import Agent 

agent = Agent(reactor, bindAddress=("10.0.0.1", 0)) 

Và sau đó sử dụng agent theo cách thông thường.

+0

cảm ơn, sẽ cho cái nhìn này – Claudiu

Các vấn đề liên quan