繁体   English   中英

如何将套接字绑定到python中的接口(socket.SO_BINDTODEVICE丢失)

[英]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')

PythonSO_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(2) )。

带有 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM