[英]How to bind a raw socket to a specific interface using python in linux centOS?
[英]How to bind socket to an interface in python (socket.SO_BINDTODEVICE missing)
这大概是一件非常简单的事情。 我是 python 新手,所以不要把我钉在十字架上。
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, IN.SO_BINDTODEVICE, "eth1"+'\0')
上面的命令给了我:
NameError: name 'IN' is not defined
我唯一的进口是
import socket
如果您不理解错误消息,则意味着您引用了一个当时不可用的名称IN
。 您的代码片段可能缺少导入语句。
出于可移植性的原因,套接字模块可能不提供 SO_BINDTODEVICE。 如果您绝对确定您在支持它的 Linux 上运行,请尝试将其替换为它的数值,即25
:
s.setsockopt(socket.SOL_SOCKET, 25, "eth1"+'\0')
或者对于python 3:
s.setsockopt(socket.SOL_SOCKET, 25, str("eth1" + '\0').encode('utf-8'))
您甚至可以“导出”缺少的选项:
if not hasattr(socket,'SO_BINDTODEVICE') :
socket.SO_BINDTODEVICE = 25
然后
sock.setsockopt(socket.SOL_SOCKET, socket.SO_BINDTODEVICE, interface+'\0')
在Python
, SO_BINDTODEVICE
存在于IN
模块中。 导入IN
解决问题。
import socket
import IN
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, IN.SO_BINDTODEVICE, "eth0")
当心:SO_BINDTODEVICE 不适用于数据包套接字 - Linux man-page man 7 socket
带有 bind() 的 eth1 的 Python 示例:
rawSocket = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(3))
rawSocket.bind(('eth1',0))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.