Я разработчик модуля, который взаимодействует с аппаратным обеспечением сторонних производителей.Этот модуль основан на Qt4.7.
Когда связь через коммуникацию разорвана, вместо того, чтобы полагаться на разъединение сигнализации сокета, которое не является мгновенным и может занять минуты, мы обнаруживаем тайм-ауты команд и еще через 2повторные попытки входят в фазу «нытья» / опроса, где мы отправляем короткие опросы устройства каждые 3 секунды, пока не получим ответ.Как только мы получим ответ, мы возобновим нормальную работу.
Что я заметил при переподключении, так это то, что мой модуль заканчивает посылку команды тайм-аута И любых опросов в одном большом пакете передачи.Я использовал WireShark для подтверждения этого.
Причиной расследования WireShark было то, что мой модуль получил много ответов на опрос при переподключении.
Приведенный ниже код (обрезанный для ясности) работает в QThread:
QScopedPointer<Packet> pending;
QPointer<PacketReply> reply = 0;
QTcpSocket socket;
quint64 bytes_written = 0;
// socket gets connected here, then...
while (continue_) {
/*
** Tx
*/
if (pending.isNull()) {
Packet* next = nextRequest();
if (next != 0) {
pending.reset(next);
reply = pending->reply();
const char* data = next->begin();
bytes_written = socket.write(data, next->count());
if (bytes_written > 0) {
print("Tx:", data, bytes_written);
next->onDispatched();
}
}
}
else if (pending->timeout()) {
pending.reset();
reply = 0;
}
Я думаю, что когда команда истекает, я хочу заставить сокет сбросить свой буфер передачи, потому что похоже, что любая сбойная команда просто объединяется в буфере записи сокета.
Я посмотрел документацию Qt для QAbstractSocket и QIODevice.Ни один из методов, которые «кричали», передал мне буфер TX.
Что можно сделать?