C# Socket是不是每一个Receive对应一个Send?
C# Socket is every one Receive corresponds to one Send?
我正在使用 C# Socket
class(使用异步方法和 SocketAsyncEventArgs
Class)实现客户端-服务器应用程序。我必须同时实现 TCP 和 UDP 功能。
我的用法是以数据包的形式从服务器向客户端发送一些命令,反之亦然,使用 TCP 发送重要命令,使用 UDP 发送不重要命令。
据说 Nagle 算法可能会导致将多个发送合并为一个接收 TCP 数据包,所以我为 TCP 套接字设置了 NoDelay
(虽然我从未体验过!)
另一个问题可能是 IP 碎片,但我认为组装碎片发生在接收之前的某个地方。因此一次发送和接收最多 64KB 一定是安全的!
我的问题::我可以假设每个一个接收对应于一个发送在 100% 的情况下? (我知道 One send 可能会导致 UDP lost Packets 的 Receive 为零)
我的提问原因: 我应该实施 1)Splitting Merged Packets 还是 2)Merging split 接收中的数据包,或者是否有一些 情况 我可以安全地假设每个接收 100% 对应一个发送?
P.S: 我对 TCP 使用 Socket.ReceiveAsync
,对 UDP 数据包使用 Socket.ReceiveFromAsync
。
不,对于 TCP,您根本不能依赖它。一个 Send
可能需要多次 Receive
调用才能读取,并且一次调用 Receive
可能会收到多个 Send
,您无能为力(就连接上的设置)以防止这种情况发生,因此您必须能够在您的应用程序中处理它。
如果您通过 TCP 流交换可变长度的消息,确定整个消息是否已被读取的常用方法是实施某种形式的“框架”,从而为每条消息添加固定字节数的前缀(例如 4 个字节来编码一个 Int32
) 指定以下消息的大小。
在你的接收方,你首先读取前 4 字节前缀(记住你可能需要用多个 Receive
s 来做这个!),将它转换成一个 Int32
然后告诉您还需要读取多少字节才能确保从流中准确读取一条消息。要阅读下一条消息,只需重复该过程即可。
我正在使用 C# Socket
class(使用异步方法和 SocketAsyncEventArgs
Class)实现客户端-服务器应用程序。我必须同时实现 TCP 和 UDP 功能。
我的用法是以数据包的形式从服务器向客户端发送一些命令,反之亦然,使用 TCP 发送重要命令,使用 UDP 发送不重要命令。
据说 Nagle 算法可能会导致将多个发送合并为一个接收 TCP 数据包,所以我为 TCP 套接字设置了 NoDelay
(虽然我从未体验过!)
另一个问题可能是 IP 碎片,但我认为组装碎片发生在接收之前的某个地方。因此一次发送和接收最多 64KB 一定是安全的!
我的问题::我可以假设每个一个接收对应于一个发送在 100% 的情况下? (我知道 One send 可能会导致 UDP lost Packets 的 Receive 为零)
我的提问原因: 我应该实施 1)Splitting Merged Packets 还是 2)Merging split 接收中的数据包,或者是否有一些 情况 我可以安全地假设每个接收 100% 对应一个发送?
P.S: 我对 TCP 使用 Socket.ReceiveAsync
,对 UDP 数据包使用 Socket.ReceiveFromAsync
。
不,对于 TCP,您根本不能依赖它。一个 Send
可能需要多次 Receive
调用才能读取,并且一次调用 Receive
可能会收到多个 Send
,您无能为力(就连接上的设置)以防止这种情况发生,因此您必须能够在您的应用程序中处理它。
如果您通过 TCP 流交换可变长度的消息,确定整个消息是否已被读取的常用方法是实施某种形式的“框架”,从而为每条消息添加固定字节数的前缀(例如 4 个字节来编码一个 Int32
) 指定以下消息的大小。
在你的接收方,你首先读取前 4 字节前缀(记住你可能需要用多个 Receive
s 来做这个!),将它转换成一个 Int32
然后告诉您还需要读取多少字节才能确保从流中准确读取一条消息。要阅读下一条消息,只需重复该过程即可。