Comment lier socket à une interface en python (socket.SO_BINDTODEVICE manquant)
C'est probablement une chose très simple.
Je suis nouveau sur python afin de ne pas me crucifier.
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, IN.SO_BINDTODEVICE, "eth1"+'s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, IN.SO_BINDTODEVICE, "eth1"+'\0')
')
la commande ci-dessus me donne:
NameError: name 'IN' is not defined
la seule importation de ce que j'ai est
import socket
OriginalL'auteur user916499 | 2011-08-28
Vous devez vous connecter pour publier un commentaire.
Si vous ne comprenez pas le message d'erreur, cela signifie que vous faites référence à un nom de
IN
qui n'est pas disponible à ce moment. Votre extrait de code est susceptible de manquer une l'importation déclaration.Le support de module ne peuvent pas offrir SO_BINDTODEVICE pour des raisons de portabilité. Si vous êtes absolument sûr que vous êtes en cours d'exécution sur Linux prend en charge, essayez de la remplacer par sa valeur numérique, qui est
25
:Ou pour python 3:
Si vous n'êtes pas à l'aide de la douille du module, vous pouvez utiliser le monkey patching comme décrit dans la stackoverflow.com/questions/12585317/requests-bind-to-an-ip
Le module est standard sur les plates-formes linux. Il contient la plupart des constantes de
/usr/include/netinet/in.h
. Bien sûr,SO_BINDTODEVICE
est fixé à 25 dans ce fichier.Le '\0' est nécessaire parce que les données sont susceptibles de les transmettre directement au C de l'API. Si le nom est venu à partir de la saisie de l'utilisateur, je voudrais aussi tronquer le nom de l'interface à IF_NAMESIZE (16 dont nul byte):
... , 25, ifname[:16]+'\0')
OriginalL'auteur hamstergene
Vous pouvez même "exporter" une option manquante:
puis
OriginalL'auteur jno
Dans
Python
,SO_BINDTODEVICE
est présent dansIN
module. L'importation deIN
permettra de résoudre le problème.OriginalL'auteur rashok