2011-11-23 21 views
6

Mam następujący kod:python: urllib2 przy użyciu innego interfejsu sieciowego

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

jest uruchomiony na komputerze z dwoma interfejsami sieciowymi. Chciałbym określić, który interfejs powinien być użyty w kodzie. W szczególności chcę, aby używał domyślnie innego niż ten, z którego korzysta ... ale mogę dowiedzieć się, który jest który, jeśli mogę po prostu wybrać interfejs.

Jaki jest najłatwiejszy/najlepszy/najbardziej pythonic sposób to zrobić?

+0

Zakładam, że nie można zmienić wartości trasy systemowej, aby wymusić połączenie z serwerem zdalnym za pomocą innego interfejsu? –

+0

@ CédricJulien: To by działało (gdybym mógł zrobić wszystkie połączenia z konkretną witryną internetową przechodząc przez inny interfejs), chociaż jestem również zainteresowany, aby wiedzieć, jak to zrobić w kodzie, jeśli to możliwe. – Claudiu

Odpowiedz

3

Jeszcze nie kompletne rozwiązanie, ale jeśli używali tylko prostych obiektów gniazd, można zrobić to, co trzeba w ten sposób:

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)) 

Zatem można zmusić system do związania gniazdo do poszukiwanych Interfejs sieciowy.

+0

Jeśli używasz Linuksa, ten [przepis] (http://code.activestate.com/recipes/439094-get-the-ip-address-associated-with-a-network-inter/) będzie przydatny mapuj z nazwy interfejsu na adres IP. – jcollado

2

Jeśli używasz Twisted na twisted.web.client.Agent, to można to osiągnąć poprzez:

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

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

a następnie za agent w zwykły sposób.

+0

dzięki, nadając temu wygląd – Claudiu

Powiązane problemy