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

标签 c# sockets tcp buffer tcpclient

我已通过套接字连接到要查询的设备。我可以毫无问题地发送命令,但是当我尝试取回数据时,它会将它分成几部分发回给我,这样我就永远不会一次真正收到完整的消息。我已经求助于多个 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/

相关文章:

Java Tcp套接字发送额外数据?

sockets - 连接超时和套接字超时建议

c# - 无法在 Azure 虚拟机上打开 TCP channel

linux - TcpStream 上的 std::io::BufReader 会导致数据丢失吗?

c++ - 以编程方式评估 somaxconn 的值,以设置监听积压参数

c# - 如何确定 GIF 中的像素是否透明 (.NET)

c# - 如何在浏览器中显示只有其内容的图像 (byte[])

c# - 如何在 C# 中获取我的 URL 的一部分/子域?

c# - 从数据库读取 200MB 文件会抛出内存不足异常

php - 套接字不工作PHP