Em quarta-feira, 1 de março de 2017, às 02:27:54 PST, Denis Shienkov escreveu: > Hi all, > > I have use Qt 5.8, and I want to send to the UDP socket many datagrams > (e.g. 10000 datagrams, each datagram have 1000 bytes size). > > I use following code: > > int busyCounter = 0; > for(;;) { > ... > const QNetworkDatagram datagram(data, m_remoteAddress, > Protocol::SlavePort); > if (m_dataSocket->writeDatagram(datagram) == -2) { > QElapsedTimer timer; > timer.start(); > const bool result = m_dataSocket->waitForBytesWritten(-1);
This isn't needed and isn't useful. QAbstractSocket::waitForBytesWritten has this: if (writeBuffer.isEmpty()) return false; Since QUdpSocket is unbuffered, the write buffer is always empty. So waitForBytesWritten will always return false. > As I understand, when I got the EAGAIN error (when the writeDatagram() > method fails > with the error code == -2), it means, that the transmit queue is full, and > I need wait > for something time, e.g. using the select() function: > > https://linux.die.net/man/2/sendmsg Which is QSocketNotifier. QUdpSocket is unbuffered, so the bytesWritten() signal is not useful. We can't add a readyWrite() signal because it would be fired all the time. You'll have to do the QSocketNotifier. ...unless QUdpSocket already creates one on that socket. The event dispatcher does not allow two QSN on the same socket, with the same type. If that happens, let us know. > and then, as I understand, I need try to send same datagram again. > > Instead of the select() I use the QUdpSocket::waitForBytesWritten() method, > which uses the select/pool/epoll internally. You don't get to poll(). See above. -- Thiago Macieira - thiago.macieira (AT) intel.com Software Architect - Intel Open Source Technology Center _______________________________________________ Development mailing list Development@qt-project.org http://lists.qt-project.org/mailman/listinfo/development