如何在Python中将套接字绑定到接口(缺少socket.SO_BINDTODEVICE)

8 投票
4 回答
34776 浏览
提问于 2025-04-17 00:29

这可能是个很简单的事情。
我刚学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

4 个回答

2

你甚至可以“导出”一个缺失的选项:

if not hasattr(socket,'SO_BINDTODEVICE') :
    socket.SO_BINDTODEVICE = 25

然后

sock.setsockopt(socket.SOL_SOCKET, socket.SO_BINDTODEVICE, interface+'\0')
3

Python 中,SO_BINDTODEVICEIN 模块里的一个东西。导入 IN 模块就能解决这个问题。

import socket
import IN

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, IN.SO_BINDTODEVICE, "eth0")
12

如果你不明白错误信息的意思,那就是你在某个地方提到了一个名字 IN,但这个名字在那个时候是不存在的。你的代码可能缺少一个 导入 语句。

socket模块可能因为兼容性问题不提供 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'))

撰写回答