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