C ++ UDP套接字数据包排队

时间:2010-10-15 09:15:21

标签: c++ sockets udp queue packet

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

如果用户代码必须处理排队,它是如何完成的?我们是否有针对套接字的recvfrom的单独线程,并将数据包放入reciver_queue并从另一个sending_queue发送到?

示例代码绝对令人敬畏。谢谢你的帮助。

3 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:1)

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

正如Goz已经注意到的那样,UDP数据包可能会在前往您的途中丢失,或者它们可能以不同的顺序运行。如果您既需要可靠性又需要订购,如果您不能使用TCP,则必须实现某种协议,该协议将在UDP上提供,例如: sliding window protocol

答案 2 :(得分:1)

使用UDP实际上只有接收套接字缓冲区。虽然有SO_SNDBUF套接字选项,但提供的值只是数据报大小的上限。出站数据报要么全部提供给硬件,要么分段(如果它比MTU大),或者丢弃。硬件通常有一些环形缓冲区,但这实际上与DMA有关,而与用户态应用无关。

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