2016-09-19 80 views
1

recv未按預期工作。 我發送10個字節(通過wireshark驗證),recv只獲取第一個字節並放棄其餘(直到下一個sendto)。 這是一個多播的東西?我很確定我用單播UDP做了同樣的事情,並且沒有問題。Python recv多播返回一個字節

這裏是我的示例代碼:

import struct, socket, multiprocessing, time 

MCAST_PORT = 62950 
MCAST_GRP = '239.0.0.13' 

def _Rx(self, RXsock, Queue): 
    print "Receiver started" 
    while True: 
     # State machine goes here to parse header and recv (<msglen>) bytes. 
     print "Waiting Rx char...", RXsock 
     char = RXsock.recv(1) # Blocks here after first byte ("1") ??? 
     print "Rx", hex(ord(char)) 



TXsock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) 
TXsock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) 

RXsock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) 
RXsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
RXsock.bind((MCAST_GRP, MCAST_PORT)) 
mreq = struct.pack("4sl", socket.inet_aton(MCAST_GRP), socket.INADDR_ANY) 
RXsock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq) 

RxQueue = multiprocessing.Queue() 
receiver = multiprocessing.Process(target=_Rx, args=(None, RXsock, RxQueue)) 
receiver.daemon = True 
receiver.start() 


TXsock.sendto("09123456789", (MCAST_GRP, MCAST_PORT)) 
time.sleep(3) 
+0

也許相關:http://stackoverflow.com/questions/2862071/how-large-should-my-recv-buffer-be-when-calling-recv-in-the-socket-library(因爲它的數據報) – Caramiriel

回答

1

,因爲您將緩衝區的大小爲一個你只得到一個字節。

documentation for socket.recv

在一次要接收的數據的最大數量由BUFSIZE指定。

嘗試通過10244096recv

man page for recv

如果消息是太長而不能在所提供的緩衝液,多餘的字節可根據插座從接收到的消息的類型被丟棄。

你的評論說你試圖一次解析頭一個字節。完成接收數據報後,您始終可以解析報頭。

如果你真的需要做緩衝的部分讀取,試圖傳遞socket.MSG_PEEK標誌recv

MSG_PEEK

此標誌將導致接收操作從的開始返回數據接收隊列而不從隊列中移除該數據。因此,後續的接收呼叫將返回相同的數據。

但是,您仍然無法一次讀取一個字節。

+0

我將bufsize設置爲1,所以我可以一次解析頭部的一個字節。 它在一個while循環中,所以它應該返回下一個接收到的下一個字節。當Rx緩衝區爲空時,應該阻塞。 其他9個字節在哪裏?它似乎與讀取一起刷新。 – Bill

+0

其他9個字節被丟棄。請參閱上面'recv'手冊頁的摘錄。 –

+0

那麼有沒有辦法做一個部分緩衝區讀取? – Bill