2014-03-27 53 views
0

我的代碼有一個主要問題。或者與系統。這是在C#中的客戶端代碼:使用網絡流的數據傳輸問題

TcpClient client = new TcpClient("192.168.1.254", 19999); 
NetworkStream nstream = client.GetStream(); 
Console.WriteLine("Connected."); 
Stream stream = new FileStream("test.dat", FileMode.Create, FileAccess.Write); 
int counter = 0; 
byte[] buffer = new byte[1024]; 
while ((counter = nstream.Read(buffer, 0, 1024)) > 0) 
{ 
    stream.Write(buffer, 0, counter); 
} 
stream.Close(); 
nstream.Close(); 
client.Close(); 
Console.WriteLine("Done here."); 

此應用程序與服務器,Python編寫的。這裏沒有火箭科學。客戶端連接,服務器立即循環發送數據直到結束並且套接字關閉。問題是,在我的機器上,這個應用程序總是在5 - 7 kB之後停止接收數據。它停止並且(如調試器顯示)掛在讀取方法上。這隻發生在我的機器上(MSDN上的Windows 7 x64,visual studio 2013 express,.net 4.5.1)。測試此應用程序也在我的機器上,但在Linux上,單聲道和其他一些Windows機器上。它在任何地方工作,但可悲的是不在這裏。我想這是我的系統出了問題,所以這裏是我試過到目前爲止:

  • 運行的應用程序,而調試器

  • 重新安裝Visual Studio的

  • 重新安裝.NET框架

  • 車窗防火牆和AV關

  • 更改目標fr amework以前的版本(3,3.5)

不幸的是,重新安裝操作系統是不可能的。我必須在我的系統上完成這項工作,但我沒有選擇。我甚至不知道是什麼導致了這個問題。我還能檢查什麼?

+0

我沒有看到與代碼有關的明顯問題,但有建議:嘗試用'Stream.CopyTo()'替換緩衝區並複製代碼,看看你是否仍然存在這個問題。其他需要檢查的東西 - AV軟件是否會干擾?連接斷開還是繼續(netstat)? Wireshark展示關於連接正在發生的事情? – LB2

回答

1

NetworkStream.Read方法在被調用時沒有可用的字節將會阻塞,直到有任何字節可用或連接關閉。所以,你可能會更好:1)設計一個協議,在該協議中你知道預先有多少字節,然後在讀取多少字節時停止讀取,或者2)在不活動超時後關閉連接。注意1)是正確編碼的唯一方法,2)如果發生網絡打嗝,會給你部分數據。