2

我是 python 新手,我的第一个程序是编写用于接收多播数据包的代码。

例如,我得到了这个代码,到处都有类似的代码。

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部分

4

2 回答 2

6

阅读模块文档struct

=表示本机字节顺序、标准大小和无对齐。4s意思是“四个字母的字符串”(四个字符连接在一起成为一个字节串),l意思是“有符号的长”,在这种情况下是一个四字节的整数。

至于其余的代码,这是设置绑定到端口 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 多播的教程。

于 2013-05-07T13:06:22.530 回答
2

struct.pack格式规范:

  • =意思是“使用平台字节序”
  • 4s意思是“第一件事是一串四个字符”
  • l意思是“后面跟着一个长整数”

因此,您正在打包(写入字节向量)四个字符,后跟一个长整数。Endianess 对后者很重要。

于 2013-05-07T13:06:22.880 回答