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
c#流是否接收到所有数据?_C#_Sockets_Serialization - Fatal编程技术网

c#流是否接收到所有数据?

c#流是否接收到所有数据?,c#,sockets,serialization,C#,Sockets,Serialization,我使用的是C#.Net和System.Net.Sockets命名空间中的Socket类。我正在使用异步接收方法。我知道这可以更容易地用web服务之类的东西来实现;这个问题是出于我的好奇心,而不是出于实际需要 我的问题是:假设客户端正在发送一些长度未知的二进制序列化对象。在使用套接字的服务器上,如何知道已接收到整个对象以及该对象已准备好进行反序列化?我考虑过用对象的长度(以字节为单位)作为对象的前缀,但在.Net世界中这似乎是不必要的。如果对象大于缓冲区,会发生什么情况?我怎么知道‘嘿,因为对象太

我使用的是C#.Net和System.Net.Sockets命名空间中的Socket类。我正在使用异步接收方法。我知道这可以更容易地用web服务之类的东西来实现;这个问题是出于我的好奇心,而不是出于实际需要


我的问题是:假设客户端正在发送一些长度未知的二进制序列化对象。在使用套接字的服务器上,如何知道已接收到整个对象以及该对象已准备好进行反序列化?我考虑过用对象的长度(以字节为单位)作为对象的前缀,但在.Net世界中这似乎是不必要的。如果对象大于缓冲区,会发生什么情况?我怎么知道‘嘿,因为对象太大,所以必须调整缓冲区’?

如果使用纯套接字,则需要知道长度。否则,缓冲区的大小是不相关的,因为即使您有一个整个数据大小的缓冲区,它也可能不会将所有数据都读入其中-check Stream.read方法,它返回实际读取的比特数,因此您需要循环,直到收到所有数据。

是的,在对所有字节进行RX之前,您不会进行反序列化。

您需要协议是自终止的(就像XML一样,有效地-您知道当关闭根元素时接收完XML文档),或者需要为数据添加长度前缀,或者需要另一端在完成后关闭流

在自终止协议的情况下,您需要有足够的钩子,以便读取代码可以告诉它何时完成。使用二进制序列化时,很可能没有足够的钩子。到目前为止,长度前缀是最简单的解决方案