This is probably a very simple thing. I\'m new to python so don\'t crucify me.
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_
In Python
, SO_BINDTODEVICE
is present in IN
module. Importing IN
will solve the problem.
import socket
import IN
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, IN.SO_BINDTODEVICE, "eth0")
If you don't understand the error message, it means you're referring a name IN
which is not available at that point. Your code snippet is likely missing an import statement.
The socket module may not offer SO_BINDTODEVICE for portability reasons. If you are absolutely sure that you're running on Linux that supports it, try replacing it with it's numerical value, which is 25
:
s.setsockopt(socket.SOL_SOCKET, 25, "eth1"+'\0')
Or for python 3:
s.setsockopt(socket.SOL_SOCKET, 25, str("eth1" + '\0').encode('utf-8'))
Beware: SO_BINDTODEVICE won't work with packet sockets - Linux man-page man 7 socket
It is not supported for packet sockets (use normal bind(2) there).
Python-Example for eth1 with bind():
rawSocket = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(3))
rawSocket.bind(('eth1',0))
You may even "export" a missing option:
if not hasattr(socket,'SO_BINDTODEVICE') :
socket.SO_BINDTODEVICE = 25
then
sock.setsockopt(socket.SOL_SOCKET, socket.SO_BINDTODEVICE, interface+'\0')