如何检查发送器是否发送UDP数据包

时间:2012-09-06 14:35:46

标签: c++ qt network-programming udp

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

3 个答案:

答案 0 :(得分:4)

UDP是一种不可靠的协议设计。它不保证数据包不会丢失,当它们丢失时,发送者不会被告知。所以你永远不知道另一方是否成功收到了UDP数据包。

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

答案 1 :(得分:3)

docs说:

  

size 数据的数据报发送到主机地址地址 at   端口端口。返回成功发送的字节数;除此以外   返回-1。

因此,如果它返回-1以外的其他内容,您可以将其视为“已发送”。但是,如果您真正想知道的是它是否能够到达另一方,那么您需要听取同行的意见。

答案 2 :(得分:3)

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