当前位置: 首页 > 知识库问答 >
问题:

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

经博延
2023-03-14

我有一个.NET套接字(system.net.sockets.Socket),我想将它用于UDP(无连接通信)。我想用轮询接收数据报,也就是说,我想调用available方法来检查一个数据报是否可用。如果是,我调用receive来接收它而不阻塞。如果不是,我会等待,稍后再投票。但现在我的问题是:

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

共有1个答案

何昆
2023-03-14

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

也就是说,在您的帖子中,您说您希望使用轮询来接收数据。对于任何实现来说,这都是一个糟糕的选择。NET的网络I/O具有非常好的异步实现模型,您可以使用(包括将套接字包装在NetworkStream对象中,以及使用ReadAsync()和C#5的Async/Await特性),这将是一个更好的选择。

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

    null

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

在TCP上强加一个消息传递范例比在UDP上强加一个可靠范例容易得多,因此,在大多数情况下,对所有网络I/O使用TCP比UDP更合适。

 类似资料:
  • 问题内容: 我的问题:使用net.Read …方法仅复制给定字节数组或切片大小的字节数。我当然不想每次分配64 kB的最大UDP数据报。 有没有一种确定数据报大小(在数据报标头中)或再次读取直到数据报被完全读取的方法? 问题答案: 尝试ReadFromUDP: ReadFromUDP从c读取UDP数据包,并将有效负载复制到b。它返回复制到b中的字节数以及该数据包上的返回地址。 数据包的大小应该从中

  • 问题内容: 为了查看我在处理传入数据方面的表现如何,我想测量TCP和UDP套接字上的队列长度。 我知道我可以通过套接字选项获取队列大小,并且可以告诉我有关TCP套接字的信息。但是对于UDP,/ ioctl仅返回下一个未决数据报的大小。有没有一种方法可以获取UDP的队列大小,而无需解析系统表,例如? 问题答案: 如ldx所述,ioctl或getsockopt不支持它。在我看来,SIOCINQ的当前实

  • 我有一个连续发送数据的UDP服务器。我要接收服务器发送的所有数据包。 在服务器端,我有两个线程。一个线程从文件中连续读取数据并放入Deque。另一个线程从deque读取数据并不断发送到UDP客户端。客户端代码不断地从服务器接收数据。

  • 我想使用Qt UDP(不是TCP)套接字传输文件。所以我这样写代码: 看来要传输的Qt UDP数据包的最小大小是8192字节。接收方总是得到第一个数据包,但不能接收其他数据包。 我对Qt和网络编程的经验很少,所以我不知道我的猜想对不对。你能告诉我如何改变这些代码来支持在第一个数据包之后接收数据包,这样我就可以传输大数据了吗?

  • 我有一个类,它接收用户发送的消息并在终端上打印出来,但现在我正在尝试编写一个类,从用户那里读取数据,将来自用户的字符串数据转换成字节数组,并将字节数组写入套接字。 我试图使用BufferedReader从用户读取数据,并使用OutputStream将字节数组写入套接字,但由于某些原因,我正在写入套接字的消息没有传递到服务器。 是一个与我发送到的服务器和端口号相同的套接字! 当我运行这个时没有错误,

  • 一个非常简单的服务器代码: 还有一个简单的客户端,可以从这个套接字读取数据: 我正在尝试的是非常高层次的,实际上也非常简单。sock.getOutputStream如何连接到s.getInputStream()? 如何通过客户端输出流发送的数据可以从服务器输入流中读取?我无法在头脑中建立联系,也无法想象它。 我的问题是inputstream和outputstream对象是如何连接的?我怎么能成为一