python `IN` 模块问题(FreeBSD)

1 投票
1 回答
2438 浏览
提问于 2025-04-15 23:45

我正在尝试使用套接字,但遇到了一些问题。

在代码示例中:

setsockopt(socket.SOL_SOCKET,IN.SO_BINDTODEVICE,self.listen_address+'\0')

我遇到了一个错误。

AttributeError: 'module' object has no attribute 'SO_BINDTODEVICE'

在Linux机器上这个属性是可以的,但在FreeBSD上,模块IN里没有任何SO_*属性。我应该安装什么端口来解决FreeBSD机器上的这个问题呢?

在Linux上测试的Python版本有:2.5.4和2.6.4;在FreeBSD上是:2.5.5。

我在书里找不到关于这个模块的任何信息,搜索关键字IN也没有找到有用的结果……

更新:

我只能绑定到地址,而不能绑定到设备。

>>> import socket
>>> s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
>>> s.bind(("eth0",3040))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1, in bind
socket.gaierror: [Errno -2] Name or service not known
>>> s.bind(("192.168.33.152",3040))
>>> s.close()

更新2:

……但我正在处理广播数据包。我试图写一个像DHCP服务器那样工作的守护进程。如果我绑定到地址,我能捕获到广播数据包吗?如果我设置了混杂模式呢?

1 个回答

1

SO_BINDTODEVICE这个选项在socket编程中并不是一个标准的选项,而且在FreeBSD系统上不支持。那为什么不直接用普通的bind(2)来指定本地地址或接口呢?

编辑:

可以看看socket对象的文档
这里有一个例子

编辑 2:

你没有说明你具体想要实现什么,所以假设你是在做一个普通的TCP/IP客户端-服务器程序。

IP是一个网络层协议(与以太网这样的数据链路协议不同),它关注的是地址而不是设备。也就是说,你不需要绑定到某个设备上——操作系统会负责将地址映射到设备,并维护一个路由表。你只有在处理广播组播时,才需要明确socket和设备之间的关系,因为在这种情况下,地址和接口之间的映射并不明显。

每个TCP/IP协议栈知道的网络接口都会被分配一个IP地址(可以查看ifconfig(8))。把你的socket绑定到那个IP地址上就可以了。

希望这对你有帮助。

编辑 3:

你有没有考虑过SO_BROADCAST选项?另外也可以看看这个问题,关于原始socket的内容。

撰写回答