python - 在 Ad-hoc 网络中使用多播套接字:[Errno 19] 没有这样的设备
问题描述
我想在 ad-hoc 网络拓扑中创建一个多播套接字连接。我在 python 中有一个客户端/服务器实现,它在正常的网络配置上运行良好,这意味着具有互联网连接的标准网络配置。
这是客户端连接器“订阅者”的代码:
if __name__ == "__main__":
multicast_group = '224.0.0.1'
server_address = ('', 10000)
# Create the socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# Bind to the server address
sock.bind(server_address)
# Tell the operating system to add the socket to the multicast group
# on all interfaces.
group = socket.inet_aton(multicast_group)
mreq = struct.pack('4sL', group, socket.INADDR_ANY)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
在正常的 Internet 连接网络中,这可以正常工作,但在 ad-hoc 网络拓扑中,这会引发错误:
文件“main.py”第 33 行
setsockopt(socket.IPPROTO_IP,socket.IP_ADD_MEMBERSHIP,mreq)
文件“usr/lib/python2.7/socket.py”,第 228 行,方法
返回 getattr(self.__sock, name)( *args)
socket.error: [错误 19] 没有这样的设备
任何想法发生了什么?
谢谢
解决方案
一个可行的解决方案是手动设置您的网络接口以供套接字使用:
sock.setsockopt(socket.SOL_SOCKET, 25, 'bat0')
并将成员资格添加到组和主机名:
group = socket.inet_aton(multicast_group)
intf = socket.gethostbyname(socket.gethostname())
sock.setsockopt(socket.SOL_IP, socket.IP_ADD_MEMBERSHIP, group + socket.inet_aton(intf))
推荐阅读
- javascript - 如何使用firebase实时数据库检查数据是否已经在html表中?
- python - 在 While 循环中将行附加到 Pandas 数据帧
- sql - sql子查询聚合
- android - Xamarin.Forms - 在 Android 设备上设置 WiFi 子网掩码
- python - 在对象数组中查找特定变量的最大值
- javascript - 无法使用 setInterval 在画布上绘制正方形?
- android - Android Studio“找不到 com.android.tools.build:gradle:3.0.1”
- apollo-server - 记录 apollo-server GraphQL 查询和每个请求的变量
- google-apps-script - 我无法向 Google 脚本添加新触发器。用户界面更改
- python - 如何保存最佳 hyperopt 优化的 keras 模型及其权重?