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

Posted

技术标签:

【中文标题】如何在 C# 中使用 TCP 客户端读取整个输入缓冲区?【英文标题】:How do you read the entire input buffer with TCP Client in C#? 【发布时间】:2012-03-29 17:13:42 【问题描述】:

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

            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

【问题讨论】:

【参考方案1】:

TCP 是面向流的。您不能一次依赖“获取全部信息”,也不能依赖任何可预测的片段大小。您必须构建一个协议或使用一个库来识别应用程序特定消息的开始和结束。您应该读取返回到缓冲区的数据,并在消息前加上消息长度或使用开始/结束消息分隔符来确定何时处理读取缓冲区中的数据。

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

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

【讨论】:

以上是关于如何在 C# 中使用 TCP 客户端读取整个输入缓冲区?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# .NET 中保持 TCP 连接打开并执行多次写入/读取?

C#以太网上位机如何读取西门子PLC的IO点状态?

7-网络芯片CH395Q学习开发-模块使用Socket0-5作为6路TCP客户端和电脑上位机TCP客户端局域网通信(Socket缓存区配置)

C# 通过tcp协议向硬件发送命令,networkstream read 读取返回信息时卡死。

如何在 C# 中处理多个客户端 TCP/IP

客户端服务端交互(TCP) java