gpt4 book ai didi

python `IN` 模块问题 (FreeBSD)

转载 作者:太空宇宙 更新时间:2023-11-03 19:37:08 24 4
gpt4 key购买 nike

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

在代码示例中:

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

我有错误

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

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

经过测试的 Linux 上的 Python 版本:2.5.4和2.6.4;在 FreeBSD 上:2.5.5

我在我的书中找不到有关此模块的任何内容,并且谷歌搜索关键字 IN 看起来像是无缝的...

更新:

我只能绑定(bind)到地址,不能绑定(bind)到设备。

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

最佳答案

SO_BINDTODEVICE 套接字选项不是标准的,并且在 FreeBSD 上不受支持。为什么你不能只使用常规的 bind(2)用于分配本地地址/接口(interface)?

编辑:

看看socket object docs .
这是 example .

编辑2:

你没有说出你到底想要实现什么,所以假设是常规的 TCP/IP 客户端-服务器。

IP 是一种网络层协议(protocol)(相对于以太网,它是一种数据链路协议(protocol)),它与设备无关,而是与地址有关。这个想法是,您不需要绑定(bind)到设备 - 操作系统负责将地址映射到设备,并维护路由表。唯一需要套接字和设备之间存在显式关系的情况是使用广播多播时,地址和接口(interface)之间的映射并不明显。

TCP/IP 堆栈已知的每个网络接口(interface)都分配有一个 IP 地址(请参阅 ifconfig(8))。将您的套接字绑定(bind)到该 IP 地址,一切就完成了。

希望这有帮助。

编辑3:

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

关于python `IN` 模块问题 (FreeBSD),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3007084/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com