Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用C#中的TCP客户端读取整个输入缓冲区?_C#_Sockets_Tcp_Buffer_Tcpclient - Fatal编程技术网

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

如何使用C#中的TCP客户端读取整个输入缓冲区?,c#,sockets,tcp,buffer,tcpclient,C#,Sockets,Tcp,Buffer,Tcpclient,我已通过套接字连接到要查询的设备。我可以发送命令没有问题,但当我试图取回数据时,它会将数据分部分发送给我,这样我就永远不会一次真正获得整个消息。我使用了多次尝试-捕获序列来尝试依次获得不同的部分,但最后得到的是最后一块。我认为这是一个时间问题,但不确定,而且,文本框在代码完成时不会显示任何文本,我认为它们至少应该显示收到的部分内容。如有任何建议,将不胜感激 Byte[] Backdata = new byte[64]; //also tried 32, 16, 64

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

            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是面向流的。你不能依赖于一次“获得全部信息”,或者以任何可预测的大小获得信息。您必须构建一个协议或使用一个库来识别特定于应用程序的消息的开始和结束。您应该读取返回缓冲区的数据,并使用消息长度作为消息前缀,或者使用开始/结束消息分隔符来确定何时处理读取缓冲区中的数据

搜索TCP帧以找到一些很好的示例,说明如何执行此操作。关于StackOverflow有几个很好的代码示例,包括中的示例(尽管它处理异步套接字)

也有一些很好的解释如何处理这个问题