[Development] There is the wrong behavior with QUdpSocket && EAGAIN on *nix?

Denis Shienkov denis.shienkov at gmail.com
Wed Mar 1 11:27:54 CET 2017

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,
            if (m_dataSocket->writeDatagram(datagram) == -2) {
                QElapsedTimer timer;
                const bool result = m_dataSocket->waitForBytesWritten(-1);
                qDebug() << "Wait result:" << result << "nsecs:" <<
timer.nsecsElapsed() << "busy counter:" << busyCounter;
            } else {
                busyCounter = 0;

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:


When the message does not fit into the send buffer of the socket, *send*()
normally blocks, unless the socket has been placed in nonblocking I/O mode.
In nonblocking mode it would fail with the error *EAGAIN* or *EWOULDBLOCK*
in this case. The *select <https://linux.die.net/man/2/select>*(2) call may
be used to determine when it is possible to send more data.

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.

But, seems it does not work, as described in the POSIX documentation,
I got following debug output:

Wait result: false nsecs: 363 busy counter: 1
Wait result: false nsecs: 140 busy counter: 232
Wait result: false nsecs: 167 busy counter: 1
Wait result: false nsecs: 139 busy counter: 238
Wait result: false nsecs: 167 busy counter: 1
Wait result: false nsecs: 167 busy counter: 19

and etc.

I suspect, that the busyCounter always should be 1, but it does
not happens, and the waitForBytesWritten() always fails!

What doing wrong?

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/development/attachments/20170301/2f2e8094/attachment.html>

More information about the Development mailing list