[英]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.