struct.pack Python中的4sL格式是什么

时间:2013-05-07 13:03:33

标签: python sockets

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

2 个答案:

答案 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对后者很重要。