【问题标题】:How do you read the entire input buffer with TCP Client in C#?如何在 C# 中使用 TCP 客户端读取整个输入缓冲区?
【发布时间】: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{}

【问题讨论】:

    标签: c# sockets tcp buffer tcpclient


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-10-27
      • 1970-01-01
      • 2013-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-08
      • 2017-07-26
      • 1970-01-01
      相关资源
      最近更新 更多