2011-07-02 66 views
3

我正在使用Csharp tcp套接字在客戶端和服務器之間發送數據。 現在,我看到它或我認爲它的問題是,tcp是一個流協議,不會推送(發送)數據,除非它們有足夠的數量。強制TCP流發送緩衝區內容

例如說我想發送一些數據,不管它是什麼並不重要,只要說它的8個字節長。我看到的行爲是無論等待它多長時間不會發送該數據,除非我更多地推遲它,直到我到達tcp緩衝區。

所以我的問題是。如果我想通過tcp發送少量的數據,我是否需要追加垃圾到最後來強制套接字發送。 (我不會覺得這很好),或者是他們的另一種方式,我可以強制流的前段發送。

在此先感謝。我仍然在學習tcp,所以請原諒這種無知。

+0

有幾種使用.Net中的套接字發送數據的方法。您正在使用哪一個,即可以向我們展示您的代碼的簡短摘錄? – svick

+0

噢,我正在使用TcpClient對象並在客戶端和服務器上設置NoDelay = true並不能解決問題。 – user826228

+0

我認爲它沒有得到數據,而是更多的與我沒有使用NetworkStream.Read正確。我會更詳細地介紹api文檔。感謝所有的幫助。 – user826228

回答

4

請勿設置NoDelay,除非您是TCP/IP專家並瞭解其全部分支。如果你還沒有讀過史蒂文斯,那就別想了。

下面是一個示例問題:如果您建立一個套接字連接並在其上發送8個字節,是立即發送8個字節還是Nagle算法等待更多數據發送?答案是「8個字節立即發送」 - 但不要考慮與Nagle混淆,直到您明確瞭解爲什麼即是答案。

下面是另一個問題:在標準的命令/響應協議中,每個數據包應用了多少Nagle延遲?答案是:沒有。再次,你應該研究爲什麼 Nagle導致沒有延遲在這種常見的情況。

如果您沒有看到以250毫秒發送的數據(Nagle在最壞的情況下導致的最大延遲),那麼還有其他錯誤。

2

你可以設置NoDelay屬性(我認爲這是什麼禁用Nagle)。