我正试着用插座,我遇到了这样的问题
在代码示例中:
setsockopt(socket.SOL_SOCKET,IN.SO_BINDTODEVICE,self.listen_address+'\0')
我有错误
^{pr2}$在Linux机器上,这个属性是可以的,但是在FreeBSD树上,模块IN
中没有任何sou*属性。我应该安装什么端口来解决FreeBDS机器上的这个问题?在
Linux上的Python版本测试: 2.5.4和2.6.4; 在FreeBSD上: 2.5.5款
我在我的书中找不到关于这个模块的任何信息,而且google关键字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服务器的守护进程。 如果我绑定到地址,我会捕获广播包吗?如果我把滥交模式打开?在
SO_BINDTODEVICE
套接字选项不是标准选项,在FreeBSD上不受支持。为什么不能使用常规的^{编辑:
看看socket object docs。
这是一个example。在
编辑2:
您没有说明您到底要实现什么,所以假设使用常规的TCP/IP客户机服务器。在
IP,作为一种网络层协议(与以太网相比,以太网是一种数据链路协议),与设备无关,而与地址有关。这个想法是,你不需要绑定到设备-操作系统负责将地址映射到设备,并维护一个路由表。在使用广播和多播时,您只需要在套接字和设备之间建立明确的关系,而地址和接口之间的映射并不明显。在
TCP/IP堆栈已知的每个网络接口都分配了一个IP地址(请参见^{} )。把你的套接字绑定到那个IP地址上,你就一切就绪了。在
希望这有帮助。在
编辑3:
你有没有研究过
SO_BROADCAST
选项?另请查看this SO question关于原始套接字。在相关问题 更多 >
编程相关推荐