2014-01-22 35 views
2

我正在使用socket(AF_UNIX, SOCK_STREAM)套接字在兩個進程之間進行通信。從套接字接收字節數的最佳方式是什麼?

我希望接收器能夠接收上限字節數,其中上限非常大(在16MB到64MB範圍內)。也就是說,我希望收到最多[cap]字節的消息,如果消息大於此消息,我想停止接收或放棄其餘消息。

從文檔中,這樣做的方式似乎是使用socket.recv(bufsize=[cap])。但有以下注意事項:

注意對於使用的硬件和網絡的現實最佳匹配,BUFSIZE的值應該是2的功率相對較小,例如,4096

這表明,緩衝區大小不是爲此目的而設計的。那麼,實現這個目標的最好方法是什麼?

+0

你不能只是收到字節,因爲他們收到至少(至少4k)字節後,至少(4k)字節,調用recv()剩下什麼? TBH,我完全不理解你的要求,或者'消息'是什麼。 –

回答

1

您應該使用循環,如ActiveState recipe所示。

根據所引用的文檔,bufsize參數最好保留其默認值。只需撥打recv和接收的字節字符串添加到您自己的緩衝區,直到其中一個條件得到滿足:

  • recv返回空值。這意味着另一端已經關閉

  • 你的緩衝區達到其最大允許大小

  • 拋出一個異常(你所談論的容量)的連接。這可能意味着連接已關閉非正常 - 檢查錯誤代碼

注意recv將阻止,如果你事先不知道要多少字節接收。請客戶事先發送消息大小以避免此問題。但請記住,如果連接不穩定,您的recv仍可能會阻止。使用timeouts並在您的循環中注意第四個停止條件以確保。

+0

謝謝。我不能依靠發件人優雅地關閉連接,所以事先發送大小是一個很好的建議。有了這個和/或你鏈接到的循環,我想我可以得到我需要的東西。 – capitalistcuttle

相關問題