UDP套接字:如何确定可用字节何时是完整数据报

时间:2015-02-21 19:30:34

标签: c# .net sockets udp

我有一个.NET套接字(System.Net.Sockets.Socket),我想用它来进行UDP(无连接通信)。我想通过轮询接收数据报,也就是说,我想调用Available方法来检查数据报是否可用。如果是,我致电Receive无阻塞地接收它。如果不是,我等待并稍后再次轮询。但现在我的问题如下:

Available仅返回可以在不阻塞的情况下读取的字节数。它不会告诉这些字节是否足以形成完整的数据报。我不知道收到的数据报有多大,所以我不能将这个检查硬编码到一定数量。

如何确定一个数据报何时结束以及下一个数据报何时开始?

1 个答案:

答案 0 :(得分:3)

正如菲利普所说,使用UDP,你要么得到整个数据报,要么根本不得。如果套接字报告数据可用,则它应该是数据报的整个数量(或数据报的某种组合)。

那就是说,在你的帖子中你说你想用轮询来接收数据。对于任何实施来说,这都是一个糟糕的选择。 .NET的网络I / O具有非常好的异步实现模型(包括将套接字包装在NetworkStream对象中并使用ReadAsync()async / {{1 C#5)的特性,这将是一个更好的选择。

此外,您应该非常确定UDP实际上是您要使用的协议。由于其不可靠性,它几乎适用于所有普通的网络应用程序。无法保证:

  • 您收到的任何数据都将被接收。允许数据报被网络删除。
  • 收到的数据将按照发送的顺序接收。数据报的传递可以由网络重新排序。
  • 收到的数据将是唯一的。允许网络多次传送相同的数据报。

对于大多数网络应用程序,需要保护业务层免受这些类型的故障的影响,这意味着在业务层和网络层之间添加您自己的可靠层。即重塑TCP。

很多更容易在TCP上强制使用消息传递范例,而不是在UDP上强加可靠的范例,因此在大多数情况下,在所有网络中使用TCP更合适/ O比UDP。