Неверный статус QTcpSocket

Я использую Qt 4.8.2 (64 бит) на Linux Debian.

У меня проблема со статусом сокета. Я клиент, подключающийся к серверу, мой соответствующий фрагмент кода:

QTcpSocket *socket = new QTcpSocket(this);
socket->connectToHost(interface[cameras[listnum].interface].ip,interface[cameras[listnum].interface].port);
qDebug() << socket->waitForConnected(10000);
qDebug() << socket->isValid();
qDebug() << socket->state();

Я подключаюсь к серверу, который является локальным для меня, и я могу отключить к нему кабель Ethernet, чтобы проверить как подключенное, так и неподключенное состояние. Я могу сказать, подключаюсь ли я по времени ожидания, если кабель подключен к серверу, то ожидание для подключения занимает менее 0,5 секунды, а если кабель не подключен, время ожидания для подключения истекает через 10 секунд.

Моя проблема в том, что я получаю тот же статус подключен или нет. Вывод qDebug:

ложный

истинный

QAbstractSocket::UnconnectedState

И это остается таким, если я действительно подключен или нет. При подключении могу отправлять данные. Я также поместил последние два утверждения в командную кнопку и убедился, что статус возврата не меняется даже через несколько секунд или минут.

Любая помощь, указывающая мне в правильном направлении, будет принята с благодарностью.


person user3854052    schedule 18.07.2014    source источник


Ответы (1)


Прежде всего, нет смысла проверять, действителен ли сокет, вас интересует именно состояние.

Если, как вы показали, waitForConnected возвращает false, то вы можете быть уверены, что state также не подключен - нет смысла в дальнейшей проверке.

Когда соединение установлено успешно, waitForConnected должно вернуть true, а state должно вернуть состояние соединения. Возможно, state станет истинным только после того, как вы очистите оставшиеся события, хотя это будет причуда Qt 4.8.2 (вы не можете попробовать 4.8.5 или 5.3.1?).

Я как-то скептически отношусь к тому, что то, что вы описываете, действительно происходит, но если это произойдет, вам нужно сначала убедить нас. Напишите автономный тестовый пример (один файл main.cpp), отредактируйте его в своем вопросе, убедитесь, что это все еще происходит в Qt 4.8.5, а затем отправьте отчет об ошибке.

person Kuba hasn't forgotten Monica    schedule 18.07.2014
comment
Спасибо за ответ. qDebug предназначен только для текущей диагностики и не будет включен в окончательный код, поскольку показывает неправильное состояние. В другом разделе кода я отправляю данные, хотя этот сокет и state() по-прежнему возвращают UnconnectedState. Я должен закончить свой текущий проект, а затем я сделаю то, что вы предлагаете, чтобы доказать ошибку. Я сделал обходной путь, синхронизировав ответ waitForConnected, а затем установил свой собственный флаг в отношении состояния соединения, он работает. Спасибо еще раз. - person user3854052; 18.07.2014
comment
Попробуйте хотя бы использовать Qt 4.8.5. - person Kuba hasn't forgotten Monica; 18.07.2014
comment
@Kuba ober .. имеет ли смысл этот ответ от windless1015? - person ZF007; 16.04.2019
comment
Я не использую синхронные API, поэтому я действительно не знаю, «имеет ли смысл» такой хак. Для меня весь смысл использования Qt в том, что это открытый исходный код, и вы можете легко создавать, отлаживать и модифицировать его. Это намного проще, чем иметь дело с хаками и обходными путями. Из всех чудовищных проектов с открытым исходным кодом создание Qt является одним из самых простых, как бы оно ни стоило. Нет причин избегать этого, я не думаю. - person Kuba hasn't forgotten Monica; 17.04.2019