c++ - TCP 响应暂停

标签 c++ c++-cli

我正在尝试向服务器发送一条 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/

相关文章:

C++11 右值引用与常量引用

c++ - 如何高效地存储非常大的图空间并具有快速索引?

c++ - g++ 找不到 header ,但我确实包含了它们

c++ - 内置运算符在哪里定义?

c++ - gcroot 的这种用法安全吗?

c++-cli - C++ Ref 类不是 System::IDisposable 的成员;实现 IDisposable 时遇到麻烦

c# - 如何将 char 和 char* 从 C# 传递到 C++/CLI?

c++ - 用 const std::vector 包装现有内存?

delegates - 使用 C++/CLI 从点击事件调用委托(delegate)

visual-c++ - 将 native c++ 类导入 CLI 项目