2011-06-05 20 views
2

我正在寫兩個python腳本通過UDP使用python 套接字進行通信。下面是代碼python:調用socket.recvfrom()兩次

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
s.bind((HOST, PORT)) 
s.setblocking(True) #I want it to be blocking 
#(...) 
(msg, addr) = sock.recvfrom(4) 
#(...) 
(msg2, addr2) = sock.recvfrom(2) 

相關的部分我想接收被阻止,我不知道整個消息的大小之前,我讀了前4個字節的一部分。上面的代碼被阻擋在sock.recvrfom(2)部分,而改性,用一個sock.recvfrom而不是兩個作品好嗎:

(msg, addr) = sock.recvfrom(6) #works ok, but isn't enough for my needs 

任何想法如何,我可以方便地在兩個部分讀取傳入的數據或爲什麼代碼不能正常工作如預期?

回答

4

socket.recvfrom(size)將(對於UDP套接字)讀取一個數據包,最多爲size字節。超出的數據是丟棄。如果您想獲得整個數據包,你必須通過一個更大的BUFSIZE,然後處理在比特數據包(而不是嘗試接受它位數。)

如果你想要一個更方便,少善變接口網絡I/O,請考慮Twisted

2

從UDP套接字隊列中讀取整個數據報

0

UDP是基於消息的協議。 recvfrom將讀取最初發送整個消息,但如果緩衝區不夠大,它會拋出一個異常:

socket.error: [Errno 10040] A message sent on a datagram socket was larger than the internal message buffer or some other network limit, or the buffer used to receive a datagram into was smaller than the datagram itself

所以我不知道你爲什麼會如果6掛在2號recvfrom字節消息最初被髮送。你應該在第一個recvfrom上拋出異常。也許發佈一個客戶端和服務器程序的實際工作,最小的例子。