如何使用C#中的TCP客户端读取整个输入缓冲区
本文关键字:输入 缓冲区 读取 客户端 何使用 中的 TCP | 更新日期: 2023-09-27 18:29:30
我已通过套接字连接到要查询的设备。我可以毫无问题地发送命令,但当我试图取回数据时,它会将数据分部分发送给我,这样我就永远不会一次真正得到整个消息。我采用了多次尝试-捕获序列,试图依次获得不同的部分,但最终只得到了最后一块。我认为这是一个时间问题,但不确定,而且,当代码完成时,文本框不会显示任何文本,我认为它们至少应该显示收到的部分内容。任何建议都将不胜感激
Byte[] Backdata = new byte[64]; //also tried 32, 16, 64
MoxaClient = new TcpClient();
MoxaClient.Connect(NportAddress, NportPort);
datastream = MoxaClient.GetStream();
datastream.Write(SCPIcommands, 0, SCPIcommands.Length);
//Function to wait for all responses
try
{
datastream.Read(Backdata, 0, Backdata.Length);
textBox1.Text += Convert.ToChar(Backdata.ToString());
}
catch
{}
try
{
datastream.Read(Backdata, 4, Backdata.Length);
textBox1.Text += Convert.ToChar(Backdata.ToString());
}
catch{}
TCP是面向流的。你不能依赖于一次"获得全部信息",也不能依赖于任何可预测的片段。您必须构建一个协议或使用一个库来识别应用程序特定消息的开始和结束。您应该读取返回缓冲区的数据,并在消息前面加上消息长度,或者使用开始/结束消息分隔符来确定何时处理读取缓冲区中的数据。
搜索TCP帧以找到一些如何做到这一点的好例子。StackOverflow上有几个很好的代码示例,包括这个问题的答案中的代码示例(尽管它处理异步套接字)。
在TCP流中发送消息也对如何处理这一问题有一些很好的解释。