python `IN` 模块问题(FreeBSD)
我正在尝试使用套接字,但遇到了一些问题。
在代码示例中:
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的内容。