2011-10-21 199 views
2

我正在爲服務器端實現基於Twisted的客戶端 - 服務器解決方案,例如和Android手機爲客戶端。 由於Andoird模擬器不採用TCP包大於1500b(或更少?),我需要能夠在服務器端對數據包進行塊存儲。在每次「transport.write」之後,如果沒有刷新套接字,Twisted會緩存外發數據,所以如果沒有某種手動或自動flush/maxpacketsize函數,分塊將無用。我如何在Twisted中執行此操作? 我熟悉「reactor.doSelect(1)」函數,但由於我使用EPoll反應器(爲了可伸縮性和性能方面的原因),我不能使用doSelect。是否有可能爲Twisted內的某些連接更改maxPacketValue?扭曲的Python:最大數據包大小?沖洗插座?

希望有人能告訴我光...

+1

這太奇怪了,問題只是神奇地解決了自己......沒有通過客戶端的大型測試包現在再次工作,我不知道爲什麼......現在我會說,案例關閉! – Dirk

+1

你不應該打電話給doSelect。它不會做你的想法。 –

+0

這個問題並沒有神奇地解決問題。您的網絡狀況發生了變化,因此恰好可以正常工作......現在。但它會改變回來,並再次被打破。看到我的答案,應該解釋如何修復你的代碼。 – Glyph

回答

1

TCP數據包由OS自動分塊,所有的應用程序可以做的就是給提示何時刷新。除此之外,應用程序可以讀取和寫入流。

兩個通信對等體的操作系統將根據鏈路上的MTU自動配置最大數據包大小,其中包括Path MTU discovery。確保不要阻止ICMP數據包使其工作。由於錯誤的MTU極其不可能是問題(無論如何總是設置1500或更小的MTU),所以您應該重新診斷您的問題,例如使用分組跟蹤器(例如wireshark)來重新診斷您的問題。

2

TCP是面向流的協議,不是面向分組的協議。當您撥打transport.write時,該數據將被附加到TCP流中,並可能以任意數量的數據包發送;它可能被分解,或與下一個或前一個呼叫write粘在一起。這是一個相當的frequently asked question about Twisted,但每個詢問它的人都會略有不同。

您希望使用協議構建工具包(如AMP或更基本上是LineReceiver)在您的協議中對消息進行分隔,而不是依賴於數據包邊界的隨機性質。