Я пишу простое сетевое приложение, которое будет отправлять и получать 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
, есть ли способ сохранить модульные тесты, которые не требуют подключения клиент-сервер?