2011-05-30 78 views
0

我正在處理一個C#應用程序,它通過TCP/IP連接到主機以發送並接收使用TCPClient Stream的響應。TCPClient不讀取傳入的數據

問題是我可以使用Stream.Write(...)發送數據,但是當我嘗試通過調用Stream.Read(...)來獲得對我發送數據的響應時,它會掛起並且永遠不會返回。

我已經檢查了像Wire-Shark這樣的網絡嗅探工具,並且可以看到來自主機的數據正在被我的網絡接口接收。爲什麼這些數據沒有被我的TCPClient讀取?

由WireShark顯示的接收數據的十六進制轉儲以00開頭,是否意味着空字符,爲TCPClient讀取創建問題?

00-1d-4F-FB-43-4b-00-1d-7E-3A-9A-20-08-00-45-00-00-34

下面是寫代碼.. 。

myTcpClient = new TcpClient(); 
myTcpClient.Connect("192.168.0.194", 1958); 
Stream myTCPStream = myTcpClient.GetStream(); 
ASCIIEncoding asen = new ASCIIEncoding(); 
byte[] msgBytes = asen.GetBytes("Message to be sent."); 
myTCPStream.Write(msgBytes, 0, msgBytes.Length); 

,這是閱讀的代碼...

byte[] bytesReceived = new byte[100]; 
int nBytesRead = myTCPStream.Read(bytesReceived, 0, bytesReceived.Length); 
myTcpClient.Close(); 

感謝您的幫助。

+0

我的魔法crytal球仍然需要修復,所以我怕你將不得不向我們展示代碼在同一時間... – DarkSquirrel42 2011-05-30 10:20:46

回答

0

這可能是一個時間問題,但它是很難沒有看到你的代碼說

另一種思考(你運行讀碼你發送的數據包後直接是它在同一個線程?):嘗試將NoDelay屬性設置爲true。這會告訴TCP堆棧立即將數據傳遞到您的應用程序,而不是等待完整的緩衝區(禁用Nagle algorithm)。這對發送接收小數據包時減少延遲很有用。

+0

是的,我正在閱讀正確的發送後在相同的線程。 wireshark捕獲的數據爲54個字節,從0x00開始。這是一種Ack? – thriller 2011-06-01 06:30:56

+0

數據將是在接收到新連接時從服務器應用程序發回的任何內容 - 它看起來像某種二進制協議。它可能有助於發佈您的Wireshark日誌 – rupello 2011-06-01 08:07:24