C++ C++;UDP套接字数据包队列

C++ C++;UDP套接字数据包队列,c++,sockets,udp,queue,packet,C++,Sockets,Udp,Queue,Packet,我使用相同的UDP套接字发送和接收数据。我想知道DGRAM套接字的数据包队列是否已经存在,或者我们是否必须单独处理它 如果用户代码必须处理排队,那么它是如何完成的?我们是否有单独的线程来为套接字接收vfrom,将数据包放入reciver_队列,并从另一个发送队列发送到 一个示例代码将非常棒。谢谢您的帮助。有一个数据包队列。但是,当数据包队列被填满时,UDP数据包开始被丢弃。当它们被丢弃时,它们将永远丢失,因此请确保继续读取数据 正如Goz所指出的,存在一个数据包队列。实际上,在应用程序中结束的整

我使用相同的UDP套接字发送和接收数据。我想知道DGRAM套接字的数据包队列是否已经存在,或者我们是否必须单独处理它

如果用户代码必须处理排队,那么它是如何完成的?我们是否有单独的线程来为套接字接收vfrom,将数据包放入reciver_队列,并从另一个发送队列发送到


一个示例代码将非常棒。谢谢您的帮助。

有一个数据包队列。但是,当数据包队列被填满时,UDP数据包开始被丢弃。当它们被丢弃时,它们将永远丢失,因此请确保继续读取数据

正如Goz所指出的,存在一个数据包队列。实际上,在应用程序中结束的整个管道的不同位置有不止一个管道。NIC上通常有一些缓冲区,然后有一些由内核管理。内核缓冲区通常可以使用setsockopt()为单个套接字调整大小


正如Goz已经指出的,UDP数据包可能会在到达您的途中丢失,也可能以不同的顺序存在。如果您需要可实现性和排序,并且无法使用TCP,则必须实现某种协议,该协议将在UDP上同时提供这两种功能,例如,使用UDP时,实际上只有接收套接字缓冲区。虽然有
SO_SNDBUF
socket选项,但提供的值只是数据报大小的上限。出站数据报要么以整体形式提供给硬件,要么以片段形式提供给硬件(如果大于MTU),要么丢弃。硬件通常有一些环形缓冲区,但这实际上与DMA有关,与userland应用程序无关


对于应用程序中的数据包排队,最直接的技术是——使其足够大以供正常使用,在严重峰值期间丢失一些数据包。当然还有其他方法。

+1:请注意,即使您读取速度足够快,UDP帧也不能保证到达(以正确的顺序或“完全”),因此请做好数据丢失的准备。当我使用recvfrom()时,如何查找UDP数据包的接收方地址??