0

我正在尝试使用 UDP 发送数据包。我知道如果通道不空闲,则不会发送数据包。我正在使用 QTudpSocket->writeDatagram发送 UDP 数据包。我正在循环中执行此操作,我想确保在发送前一个数据包之前不发送另一个数据包。是否有标志或任何其他方式可以检查并确保数据包已发送?

4

3 回答 3

5

UDP 在设计上是一种不可靠的协议。它不能保证数据包不会丢失,并且当它们丢失时,发送者不会被告知这一点。所以你永远无法知道对方是否成功接收了UDP数据包。

当然,除非您的应用程序级协议发送某个响应。但是响应也很容易丢失,因此没有响应并不能明确证明没有收到数据包。

于 2012-09-06T14:44:38.873 回答
4

文档说:

将数据大小为 size数据报发送到端口port的主机地址地址。返回成功发送的字节数;否则返回 -1。

因此,如果它返回的内容不是-1您可以认为它“已发送”。但是,如果您真正想知道的是它是否到达了另一边,您会想听听同行的意见。

于 2012-09-06T14:39:01.063 回答
3

通常,为了尽可能快地发送 UDP 数据包(但不会更快),您需要将套接字置于非阻塞模式,然后循环发送数据包,直到 send()/sendto() 返回 -1/EAGAIN (又名 EWOULDBLOCK)。当返回结果代码时,跳出你的发送循环并等待套接字再次变为可写。在 Qt 下,你可以设置一个 QSocketNotifier 对象(一次,在你设置你的套接字之后),只要你的套接字有空间容纳更多的传出数据,它就会发出一个激活的(int)信号。当您收到该信号时,您可以发送更多数据包。

于 2012-09-06T15:01:39.563 回答