我是python的新手,我的第一个程序是编写接收组播数据包的代码。
我得到了this代码和类似的代码。
import socket
import struct
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(('', 4242))
mreq = struct.pack("=4sl", socket.inet_aton("224.51.105.104"), socket.INADDR_ANY)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
while True:
print sock.recv(10240)
我无法弄清楚这段代码。特别是 4sl 部分
答案 0 :(得分:6)
阅读the struct
module documentation。
=
表示本机字节顺序,标准大小,没有对齐。 4s
表示“四个字母的字符串”(四个字符串连接成一个字节串),l
表示“签名长”,在这种情况下是一个四字节的int。
至于其余的代码,这是设置一个绑定到端口4242的多播udp监听器。mreq
是这个结构(C代码):
struct ip_mreq {
struct in_addr imr_multiaddr; /* IP multicast address of group */
struct in_addr imr_interface; /* local IP address of interface */
};
此代码将该数据存储在mreq
中,传递给setsockopt
以通知操作系统您对该多播地址中的数据感兴趣。
谷歌搜索在IP多播上显示this tutorial。
答案 1 :(得分:2)
来自struct.pack
格式规范:
=
表示“使用平台endianess”4s
表示“第一件事是一串四个字符”l
表示“跟随长整数”所以你打包(写一个字节向量)四个字符后跟一个长整数。 Endianess对后者很重要。