Обнаружение разъединения QTcpSocket с указателем на QIODevice - PullRequest
0 голосов
/ 07 мая 2019

Я пишу простое сетевое приложение, которое будет отправлять и получать TCP-сообщения одному слушателю.Я использую класс контекста, чтобы обернуть большую часть логики коммуникации как таковой:

class context : public QObject
{
    Q_OBJECT

public:
    void setDevice (unique_ptr<QIODevice> device);
    void sendMessage (message msg);

signals:
    void newMessage (message msg);

private:
    unique_ptr<QIODevice> m_device;
}

Универсальный QIODevice предоставляется объекту вместо конкретного подтипа QTcpConnection, так что логика может быть протестирована безсетевое соединение.Я ожидал, что любые сетевые ошибки будут представлены как ошибки ввода-вывода из QIODevice.Однако, если хост отключается, QIODevice не издает сигнал.QTcpConnection испускает сигнал (disconnected), но базовый QIODevice остается открытым, продолжает разрешать чтение и запись и не дает никаких уведомлений об ошибке.Мое подтверждение того, что сокет видит разрыв, состоит в том, что строка ошибки в QIODevice меняется с «Неизвестная ошибка» на «Сокет не подключен»;но проверка на наличие строки ошибки кажется хаком, который не должен быть необходим.

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

...