我正在尝试使用套接字,我遇到了这样的问题
在代码示例中:
setsockopt(socket.SOL_SOCKET,IN.SO_BINDTODEVICE,self.listen_address+'\0')
我有错误
AttributeError: 'module' object has no attribute 'SO_BINDTODEVICE'
在Linux机器上,此属性正常,但在FreeBSD trere中,模块IN
中没有任何SO_ *属性。我应该在FreeBDS机器上安装什么端口来解决这个问题?
Linux上测试的Python版本: 2.5.4和2.6.4; 在FreeBSD上: 2.5.5
我在本书中找不到关于此模块的任何内容,并且googling关键字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服务器一样的守护进程。 如果我绑定到地址,我会捕获广播数据包吗?如果我要设置混杂模式?
答案 0 :(得分:1)
SO_BINDTODEVICE
套接字选项不是标准选项,FreeBSD不支持。为什么不能只使用常规bind(2)
来分配本地地址/接口?
看一下socket object docs 这是一个example。
您没有说明您要实现的目标,因此假设常规的TCP / IP客户端服务器。
IP,作为网络层协议(例如,以太网,它是一种数据链路协议),不关心设备,而是地址。这个想法是你不需要绑定到设备 - 操作系统负责将地址映射到设备,并维护路由表。在使用广播和多播时,只需要在套接字和设备之间建立显式关系,其中地址和接口之间的映射并不明显。
为TCP / IP堆栈已知的每个网络接口分配一个IP地址(请参阅ifconfig(8)
)。将您的套接字绑定到该IP地址,您将全部设置好。
希望这有帮助。
您是否查看了SO_BROADCAST
选项?另请查看this SO question关于原始套接字。