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)