我使用相同的UDP套接字来发送和接收数据。我想知道DGRAM套接字的数据包排队是否已经存在,或者我们是否必须单独处理它。
如果用户代码必须处理排队,它是如何完成的?我们是否有针对套接字的recvfrom的单独线程,并将数据包放入reciver_queue并从另一个sending_queue发送到?
示例代码绝对令人敬畏。谢谢你的帮助。
答案 0 :(得分:8)
有一个数据包队列。但是,当数据包队列被填满时,UDP数据包开始被丢弃。当它们被丢弃时,它们将永远丢失,因此请确保您继续阅读数据!
答案 1 :(得分:1)
正如Goz所说,有一个数据包队列。实际上,在您的应用程序中以整个管道的不同位置存在多个。 NIC上通常有一些缓冲区,然后有一些由内核管理。通常可以使用setsockopt()来为各个套接字调整内核缓冲区的大小。
正如Goz已经注意到的那样,UDP数据包可能会在前往您的途中丢失,或者它们可能以不同的顺序运行。如果您既需要可靠性又需要订购,如果您不能使用TCP,则必须实现某种协议,该协议将在UDP上提供,例如: sliding window protocol
答案 2 :(得分:1)
使用UDP实际上只有接收套接字缓冲区。虽然有SO_SNDBUF
套接字选项,但提供的值只是数据报大小的上限。出站数据报要么全部提供给硬件,要么分段(如果它比MTU大),或者丢弃。硬件通常有一些环形缓冲区,但这实际上与DMA有关,而与用户态应用无关。
应用程序中最直接的数据包排队技术是circular buffer - 使其足够大,可以正常使用,在重峰期间丢失一些数据包。当然还有其他方法。