2012-02-07 47 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流量并验证响应长度。