При каких обстоятельствах передается QAbstractSocket :: TemporaryError? - PullRequest
0 голосов
/ 19 января 2019

Итак, я внедряю систему удаленного управления в реальном времени на C ++ и решил выбрать QT (в которой я новичок) для графического интерфейса. В моей системе более одного компьютера, и в основном мой графический интерфейс будет контролировать программы, которые я написал и запускаю на других компьютерах через соединение TCP / IP.

Я просматривал документацию QT об ошибках сокетов, которые могут быть переданы / отправлены , и я не смог понять TemporaryError.

QAbstractSocket::TemporaryError -> A temporary error occurred (e.g., operation would block and socket is non-blocking).

Насколько я понимаю, сокеты QT неблокируемы, и с помощью waitForConnected() , waitForReadyRead(), waitForBytesWritten(), waitForDiscconected() можно выполнять операции блокировки. И, естественно, он не выдает такую ​​ошибку при использовании этих операций блокировки, поскольку это не ошибка, а выбор программиста, который нужно заблокировать.

Я подумал, что, возможно, когда буфер ОС заполнен и нужно записать больше данных в сокет, он может заблокироваться, и можно будет получить выданный TemporaryError. Поэтому я попытался стимулировать это, заставив получателя вообще не получать, а отправитель записывал и сбрасывал в сокет, а затем возвращался в цикл обработки событий, а когда тайм-ауты таймера перезаписывали и перепрошивали, и так далее.

Я видел, что через некоторое время буфер ОС заполнен, но теперь внутренний буфер QAbstractSocket or QIODevice получает данные для хранения (это можно проверить с помощью QIODevice::bytesToWrite(): он возвратил 0 при первых 8-10 попытках записи, затем начать накопление после остальных попыток). И снова нет TemporaryError.

Для меня важно разобраться со всеми возможными ошибками сокетов, и сейчас я не знаю, как с этим справиться, так как я не мог понять, как это вообще может возникнуть. У кого-нибудь есть идея?

...