2013-05-07 58 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