How to bind socket to an interface in python (socket.SO_BINDTODEVICE missing)

后端 未结 4 1618
攒了一身酷
攒了一身酷 2020-12-06 08:14

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_         


        
相关标签:
4条回答
  • 2020-12-06 08:50

    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")
    
    0 讨论(0)
  • 2020-12-06 08:53

    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'))
    
    0 讨论(0)
  • 2020-12-06 09:03

    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))
    
    0 讨论(0)
  • 2020-12-06 09:05

    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')
    
    0 讨论(0)
提交回复
热议问题