2009-12-27 61 views
0

我有一個繼承自TcpClient的類。在那個班裏,我有一個處理回答的方法。在這種方法中,我打電話給我的NetworkStream和MyBase.GetStream,並調用Read。NetworkStream.Read延遲.Net

這可以正常工作,第一次讀取塊的時間太長。而且太長時間我的意思是套接字已經收到了大量的數據,但直到達到任意限制時纔會讀取它。我可以看到它使用數據包嗅探器WireShark收到了大量的數據。

我已經將接收緩衝區設置爲少量,並且非常少量(如只是幾個字節)無濟於事。我對傳遞給讀取方法的緩衝區字節數組做了同樣的處理,但仍然延遲。

或者換句話說。我下載600k。下載需要5秒鐘(稍微超過100k /秒連接到服務器是有道理的)。最初的Read調用需要2-3秒,並告訴我只有256個字節可用(256是Recieve緩衝區和我讀入的數組的大小)。然後奇蹟般地,其他幾十萬字節可以在256字節的塊中讀取,每個字節只有幾個進程滴答。使用數據包嗅探器,我知道在最初的2-3秒內,套接字已經收到了不止256個字節。我的連接不是.25k /秒3秒,然後400k 2秒。

當他們進來時,我如何從套接字中獲取字節?

+0

你的網卡和你的應用之間還有什麼?禁用防火牆,病毒掃描程序,CRL,代理,看看會發生什麼。 – 2009-12-27 12:24:40

+0

nobugz,這是問題。這是我的反病毒應用程序。它必須緩衝一定數量的字節才能在將它送入套接字緩衝區之前進行掃描。 這是有道理的,因爲我正在使用一個衆所周知的端口,它會掃描。我不敢相信我沒有想到這一點。 您應該將其作爲回答發佈,以便將其標記爲好。 – Gilbes 2009-12-28 03:36:18

回答

0

我以前也遇到過這幾次,它似乎與檢查機器的Internet Explorer設置(代理設置/局域網設置等等),導致2-3秒的延遲有關。

System.Net命名空間(即WebClient,HttpWebRequest)中的類似乎在第一個請求中自動執行此操作。

您可以嘗試關閉或更改IE的代理設置/ LAN設置,特別是自動設置檢測選項,這可能會有所幫助。

如果這沒有幫助,看看這篇文章:Mysterious delay on first use of HttpWebRequest.GetRequestStream。這不完全是TcpClient,但我認爲這是同樣的問題。

希望這會有所幫助。

+0

這是個好主意。但我禁用了檢測代理,在IE和app.config中,並沒有影響延遲。 – Gilbes 2009-12-28 03:28:52

1

編寫開源C# network library時遇到了類似的問題。嘗試設置:

tcpClient.NoDelay = true; 
tcpClient.Client.NoDelay = true; 

這會禁用默認情況下運行的nagle algorithm。這在發送和接收非常少量的數據時會故意造成各種隨機延遲。