簡體   English   中英

recv和recvfrom,使用python進行套接字編程

[英]recv and recvfrom, socket programming using python

我是python的新手,也是socket編程的新手。

我對socket.recvfrom()socket.recv()感到困惑

我理解通常對於UDP,人們使用recvfrom()而對於TCP,人們使用recv()

例如,

serverSocketUDP = socket(AF_INET, SOCK_DGRAM)
serverSocketTCP = socket(AF_INET, SOCK_STREAM)
#... define server...
#...
message, clientAddress = serverSocketUDP.recvfrom(2048) #why 2048 for UDP? Ive seen several examples like this.
message2 = serverSocketTCP.recv(1024) #Again, why 1024 for TCP? 

如上例所示,我感到困惑的是數字。 為什么2048和1024用於不同的協議? 這些數字代表什么? 請解釋。 我希望我很清楚。 謝謝。

你讓他們切換。 TCP套接字應該使用socket.recv ,UDP套接字應該使用socket.recvfrom 這是因為TCP是面向連接的協議。 創建連接后,它不會更改。 另一方面,UDP是無連接(“發送 - 忘記”)協議。 您使用recvfrom因此您知道應該向誰發送數據。 Recvfrom不能以相同的方式在TCP套接字上工作。

對於1024/2048,這些表示您要接受的字節數。 一般來說,UDP比TCP具有更少的開銷,允許您接收更多數據,但這不是一個嚴格的規則,在這種情況下幾乎可以忽略不計。 您可以根據需要盡可能多地收到。 4096也是常見的(對於兩者而言)。

為什么2048和1024用於不同的協議?

這些是非常隨意的數字,取決於正在實施的協議。 即使TCP號有效,您提供的UDP號也很可能是錯誤的。

TCP實現了一個流協議,您可以在任何大小的塊中讀取它。 你可以做recv(1)獲取一個字節或recv(100000)如果你想獲取大塊。 recv可以自由地返回您要求的較小塊,因此您可能會獲得與您想要的不同的大小。 1024非常小,你可以毫無問題地閱讀更大的塊。

UDP實現消息協議。 您必須要求足夠的字節來覆蓋整個消息,否則它將被丟棄。 這個大小取決於協議。 它通常用於將消息限制為1500(標准以太網數據包的最大大小),但它可以是高達65535的任何內容。檢查實際協議規格的最大值。

我認為人們通常使用recvfrom來進行UDP。 因為在TCP中,一旦建立連接,地址信息就不會改變,因此recvfrom總是為連接信息字段返回None。

在上面的代碼中,它將在此行中出錯:

message2, clientAddress2 = serverSocketTCP.recv(1024)

因為:recvfrom()返回(data,connection_information),而recv()只返回數據。 因此,它會引發ValueError,因為您正在嘗試解壓縮非元組值。

1024或2048只定義緩沖區大小,但它不會在返回之前等待那么多數據。 例如:

#One side, 'receiver' is a socket
receiver.recv(2048)

#Second side, 'sender' is a socket
sender.send('abc'.encode('utf-8'))

顯然,'sender'發送的數據遠小於2048字節,但'recv'調用將在收到'sender'發送給它的數據后立即返回

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM