2008-12-02 5 views
19

J'ai un serveur avec deux interfaces réseau différentes, chacune avec une adresse IP différente. Comment puis-je créer un socket pour qu'il sorte une adresse IP spécifique?Comment créer une socket sortante vers une interface réseau SPECIFIC?

Je préférerais un exemple python, mais la question est agnostique du langage, alors éloignez-vous.

EDIT: S'il vous plaît ne me donnez pas "Vous ne pouvez pas" comme réponse. Je veux dire, c'est un ordinateur. Je peux faire tout ce que je veux, par exemple - je peux désactiver par programmation l'interface que je ne veux pas à la volée. Je cherche quelque chose de plus joli.

Répondre

12

Vous pouvez certainement lier un socket à un périphérique spécifique.

Je ne sais pas comment le faire en python, mais en utilisant le socket berkeley api (en C), vous devez appeler setsockopt(), en utilisant l'option SO_BINDTODEVICE.

Vous transmettez un descripteur d'interface, de type struct ifreq. Idéalement, vous obtiendrez le contenu du descripteur d'interface en utilisant ioctl(), et en demandant SIOCGIFINDEX - en passant le nom de l'interface (par exemple eth0) comme argument.


edit: juste fait une recherche rapide et a trouvé la documentation this des méthodes de prise en python. setsockopt() est parmi eux.

+0

Merci beaucoup! Je vais essayer et rendre compte. – Mikle

+0

Fonctionne pour Linux uniquement. Qu'en est-il d'OS X? – Dor

11

Juste une petite note - ce dont j'avais vraiment besoin est de lier à une adresse IP spécifique, et juste pour être complet, la solution est de lier le socket après la création. Source en python:

import socket 
s = socket.socket() 
s.bind(("127.0.0.1", 0)) 
s.connect(("321.12.131.432", 80)) 
1
import socket 
s = socket.socket() 
s.bind((get_ip_address('eth0'), 0)) 

de Quora

+1

Cela ne fonctionnera pas sans la définition de get_ip_address – toth

Questions connexes