Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.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#_.net_Sockets_Asynchronous_Tcp - Fatal编程技术网

C# 套接字接收异步合并数据包

C# 套接字接收异步合并数据包,c#,.net,sockets,asynchronous,tcp,C#,.net,Sockets,Asynchronous,Tcp,我打算通过套接字接收数据包,但由于数据包是从发送方以高频率发送的,因此许多数据包被打包到单个字节数组中SocketAsyncEventArgs.Buffer然后保存多个数据包,即使它们是单独发送的(使用wireshark验证) 我已经尝试对传入的数据包进行排队并异步处理,但仍然得到了相同的结果 这种行为的原因可能是什么?我可能弄错了,但这不是唠叨算法的作用吗? 您的套接字应该有一个禁用此功能的标志。TCP就是这样工作的。TCP连接是一个双向字节流,您必须这样对待它。从一端发送一次可能会导致接收方

我打算通过套接字接收数据包,但由于数据包是从发送方以高频率发送的,因此许多数据包被打包到单个
字节
数组中
SocketAsyncEventArgs.Buffer
然后保存多个数据包,即使它们是单独发送的(使用
wireshark
验证)

我已经尝试对传入的数据包进行排队并异步处理,但仍然得到了相同的结果


这种行为的原因可能是什么?

我可能弄错了,但这不是唠叨算法的作用吗?
您的套接字应该有一个禁用此功能的标志。

TCP就是这样工作的。TCP连接是一个双向字节流,您必须这样对待它。从一端发送一次可能会导致接收方多次读取,反之亦然,多次发送可能以一次读取结束,并且传输不会保留应用程序消息边界

您必须缓冲输入,直到您知道您有一个完整的应用程序消息。常用的方法有:

  • 固定长度消息
  • 消息前面的预挂起长度
  • 使用特殊的“消息结束”分隔符分隔流

确切地说,TCP是一种流协议(应用程序使用的是字节流,而不是数据包)。UDP是一种数据报协议(离散数据包),我使用的协议是使用换行符作为分隔符。但是,有些消息的数据中有换行符-我应该如何区分它们呢?嗯,尝试一些不可打印的字符,如
\001
(固定字段分隔符)或其他不在数据中的字符来分隔消息。我自己没有制定协议。我必须对此作出反应:/TCP等流协议上使用的协议需要某种方法来唯一标识消息限制。通过消息头中的唯一字符/序列或长度字段。如果它们都不存在,则协议存在缺陷,无法可靠地接收。不,不是。TCP是一个流。期望接收所提供缓冲区大小和每次读取未完成字节数的1字节到最小值之间的任何位置。不管数据是通过一个或多个发送呼叫发送的。禁用nagle也无济于事;尽管这似乎有帮助。(-1)