- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试使用套接字,但遇到这样的问题
在代码示例中:
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 .
你没有说出你到底想要实现什么,所以假设是常规的 TCP/IP 客户端-服务器。
IP 是一种网络层协议(protocol)(相对于以太网,它是一种数据链路协议(protocol)),它与设备无关,而是与地址有关。这个想法是,您不需要绑定(bind)到设备 - 操作系统负责将地址映射到设备,并维护路由表。唯一需要套接字和设备之间存在显式关系的情况是使用广播和多播时,地址和接口(interface)之间的映射并不明显。
TCP/IP 堆栈已知的每个网络接口(interface)都分配有一个 IP 地址(请参阅 ifconfig(8)
)。将您的套接字绑定(bind)到该 IP 地址,一切就完成了。
希望这有帮助。
您是否研究过SO_BROADCAST
选项?另请查看this SO question关于原始套接字。
关于python `IN` 模块问题 (FreeBSD),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3007084/
我是一名优秀的程序员,十分优秀!