2010-10-15 136 views
4

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

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

一个示例代码将是绝对可怕的。谢谢你的帮助。

+0

当我使用recvfrom时,如何找出udp数据包的接收器地址(http://stackoverflow.com/questions/3940612/c-dgram-socket-get-the-receiver-address)? – SkypeMeSM 2010-10-15 09:54:42

回答

8

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

+5

+1:请注意,即使您读取的速度够快,也不能保证UDP帧到达(按照正确的顺序或“完全”),以便为数据丢失做好准备。 – ereOn 2010-10-15 09:35:38

1

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

正如Goz已经指出的那样,UDP数据包可能在途中丢失,或者它们可能以不同的顺序驱动。如果你需要可靠性和顺序,并且如果你不能使用TCP,你将不得不实现某种协议,这种协议将提供UDP协议,例如UDP协议。 sliding window protocol

1

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

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