我正在尝试使用UDP发送数据包。我知道如果频道没有空闲,则不会发送数据包。我正在使用QT' udpSocket->writeDatagram
发送UDP数据包。我是在循环中进行的,我想确保在上一个数据包发送之前我不发送另一个数据包。是否有标志或任何其他方式我可以检查并确保数据包已发送?
答案 0 :(得分:4)
UDP是一种不可靠的协议设计。它不保证数据包不会丢失,当它们丢失时,发送者不会被告知。所以你永远不知道另一方是否成功收到了UDP数据包。
当然,除非您的应用程序级协议发送一定的响应。但是响应可能很容易丢失,因此没有响应就没有明确的证据证明没有收到数据包。
答案 1 :(得分:3)
docs说:
将 size 的数据的数据报发送到主机地址地址 at 端口端口。返回成功发送的字节数;除此以外 返回-1。
因此,如果它返回-1
以外的其他内容,您可以将其视为“已发送”。但是,如果您真正想知道的是它是否能够到达另一方,那么您需要听取同行的意见。
答案 2 :(得分:3)
通常,为了尽可能快地发送UDP数据包(但不会更快),您需要将套接字置于非阻塞模式,然后在循环中发送数据包,直到send()/ sendto()返回 - 1 / EAGAIN(又名EWOULDBLOCK)。返回结果代码后,中断发送循环并等待套接字再次变为可写。在Qt下,您可以设置一个QSocketNotifier对象(一次,在您设置套接字后),只要您的套接字有更多传出数据的空间,它就会发出一个激活的(int)信号。当您收到该信号时,您可以发送更多数据包。