python`IN`模块问题(FreeBSD)

时间:2010-06-09 15:05:01

标签: python sockets

我正在尝试使用套接字,我遇到了这样的问题

在代码示例中:

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服务器一样的守护进程。 如果我绑定到地址,我会捕获广播数据包吗?如果我要设置混杂模式?

1 个答案:

答案 0 :(得分:1)

SO_BINDTODEVICE套接字选项不是标准选项,FreeBSD不支持。为什么不能只使用常规bind(2)来分配本地地址/接口?

编辑:

看一下socket object docs 这是一个example

编辑2:

您没有说明您要实现的目标,因此假设常规的TCP / IP客户端服务器。

IP,作为网络层协议(例如,以太网,它是一种数据链路协议),不关心设备,而是地址。这个想法是你不需要绑定到设备 - 操作系统负责将地址映射到设备,并维护路由表。在使用广播多播时,只需要在套接字和设备之间建立显式关系,其中地址和接口之间的映射并不明显。

为TCP / IP堆栈已知的每个网络接口分配一个IP地址(请参阅ifconfig(8))。将您的套接字绑定到该IP地址,您将全部设置好。

希望这有帮助。

编辑3:

您是否查看了SO_BROADCAST选项?另请查看this SO question关于原始套接字