2013-05-07 90 views
1

我是新的,我的第一个节目是写代码,用于接收多播包。什么是蟒蛇4SL格式struct.pack的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部分

回答

5

阅读the struct module documentation

=表示本地字节顺序,标准尺寸和不对齐。 4s是指“四字母串”(4个炭连接在一起成一个字节字符串),l手段“符号长”,在这种情况下一个四字节的INT。

对于代码的其余部分,这是建立绑定到端口4242 mreq一个多播UDP侦听该结构(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

+0

'INET_ATON(3)'已经确实为网络字节顺序转换的本机的,所以'='是正确的。 – Aya 2013-05-07 13:19:25

+0

Endianess不适用于char数组(如Python'socket.inet_aton'的返回值是),仅适用于多字节数值。 – 2013-05-07 13:26:43

+0

@StefanoSanfilippo好点,并且由于'socket.INADDR_ANY'无论如何都是零,所以字节顺序是不相关的。 – Aya 2013-05-07 13:36:55

2

struct.pack格式规范:

  • =表示 “使用平台字节序”
  • 4s的意思是 “第一件事是四个字符的字符串”
  • l的意思是 “长整型遵循”

所以你正在打包(写入一个字节向量)四个字符后面跟一个长整数。 Endianess对于后者很重要。

+0

那么这意味着它只能接收4个字符和一个长。 RYT。?? – 2013-05-07 13:19:11

+0

来自文档:“为了打包,字符串被截断或用适当的空字节填充以使其适合。”所以,如果你的字符串长于4个字符,只会考虑前4个字符;如果它更短,则会添加'\ 0'。由于你正在打包一个IP地址,你将得到正好4个字节(字节)。 – 2013-05-07 13:24:26