我正在尝试向服务器发送一条 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 );
最佳答案
挂起可能是Read等待整个data->Length被接收的结果。例如,如果 data->Length 为 100,而服务器仅响应 80 个字节,则 Read 命令将阻塞,直到收到其他 20 个字节。
在许多协议(protocol)中,有一个包含响应长度的固定长度的 header 。这允许接收器首先接收固定长度的 header ,然后设置另一个可变长度的读取以获取剩余数据。
也许使用 Wireshark 来监控 IP 流量并验证响应长度。
关于c++ - TCP 响应暂停,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9184116/