gpt4 book ai didi

c# - 你如何在 C# 中使用 TCP 客户端读取整个输入缓冲区?

转载 作者:可可西里 更新时间:2023-11-01 02:52:47 26 4
gpt4 key购买 nike

我已通过套接字连接到要查询的设备。我可以毫无问题地发送命令,但是当我尝试取回数据时,它会将它分成几部分发回给我,这样我就永远不会一次真正收到完整的消息。我已经求助于多个 try-catch 序列来尝试连续获取不同的部分,但我只是以最后一个 block 结束。我认为存在时间问题但不确定,此外,代码完成后文本框不显示任何文本,我认为它们至少应该显示收到的部分内容。任何建议将不胜感激

            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 是面向流的。您不能依赖于一次或以任何可预测的片段大小“获取完整消息”。您必须构建一个协议(protocol)或使用一个库来识别应用程序特定消息的开始和结束。您应该读取返回缓冲区的数据,并在消息前加上消息长度或使用开始/结束消息定界符来确定何时处理读取缓冲区中的数据。

搜索 TCP framing 找到一些很好的例子来说明如何做到这一点。 StackOverflow 上有几个很好的代码示例,包括 answers to this question 中的代码示例(尽管它处理异步套接字)。

Sending Messages in a TCP Stream对于如何处理这个问题也有一些很好的解释。

关于c# - 你如何在 C# 中使用 TCP 客户端读取整个输入缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9930183/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com