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