2012-02-07 42 views
1

我想發送一個tcp消息到服務器並得到響應,但是當我試圖讀取服務器響應時,我的程序掛起。我該如何解決這個問題,我做錯了什麼?TCP響應暫停

這裏是我的代碼:

TcpClient^ client = gcnew TcpClient("1.1.1.1", 888); 
NetworkStream^ stream = client->GetStream(); 
array<Byte>^data = SE::crypt(key + this->txtUsername->Text + "&" + this->txtPassword->Text + "&" + SE::Serialize("C")); 
stream->Write(data, 0, data->Length); 
data = gcnew array<Byte>(256); 
String^ responseData = String::Empty; 
Int32 bytes = stream->Read(data, 0, data->Length); 
responseData = System::Text::Encoding::ASCII->GetString(data, 0, bytes); 
Console::WriteLine("Received: {0}", responseData); 
client->Close(); 

我的代碼在暫停的時候我調試:

Int32 bytes = stream->Read(data, 0, data->Length); 
+0

看起來你沒有得到迴應,否則會返回。 – Marlon 2012-02-07 21:33:59

回答

0

的懸掛可以讀取的等待整個數據 - 結果>要接收長度。例如,如果data-> Length是100並且服務器僅響應80個字節,則Read命令將阻塞,直到接收到另外20個字節。

在許多協議中,有一個包含響應長度的固定長度頭。這允許接收器首先接收固定長度的報頭,然後設置另一個可變長度的Read來獲取剩餘的數據。

也許使用Wireshark來監視IP流量並驗證響應長度。