Russian Qt Forum

Qt => Работа с сетью => Тема начата: qate от Декабрь 22, 2015, 12:16



Название: Критический Баг QTcpSocket bind, можно ли обойти ?
Отправлено: qate от Декабрь 22, 2015, 12:16
Простой код:
Код:
	QTcpSocket* s = new QTcpSocket(this);
s->bind(QHostAddress("192.168.0.11"), 0);
s->connectToHost(QHostAddress("192.168.0.22"), 1234, QIODevice::ReadWrite);
Вешает qt в бесконечном цикле, если удаленный хост сразу порвал соединение (файерволл там стоит например)

Есть ли мысли как обойти ?




Название: Re: Критический Баг QTcpSocket bind, можно ли обойти ?
Отправлено: navrocky от Декабрь 22, 2015, 19:03
Минимальный бы примерчик-проект не помешал. А то лень самому создавать, чтобы поглядеть что там стряслось  ;D


Название: Re: Критический Баг QTcpSocket bind, можно ли обойти ?
Отправлено: torwig от Декабрь 22, 2015, 22:46
1. Какая версия Qt/ОС или на всех версиях/ОС подобное наблюдается?
2. Функцией bind() вы на какой-то интерфейс биндите свой клиентский сокет?
3. ReadWrite установлен по умолчанию, можете его не указывать явно.
4. Сигнал error() ипускает сокет?
5. Пробовали следить за сменой состояния сокета, привязываясь к сигналу stateChanged(QAbstractSocket::SocketState socketState)? Это чтобы видно было, например, что состояние Connected ,а потом резко Unconnected и "зависло" все. Расскажите, как Вы определили, что удаленный хост порвал соединение? Сигнал error соотвествущий пришел или Wireshark использовали?


Название: Re: Критический Баг QTcpSocket bind, можно ли обойти ?
Отправлено: Bepec от Декабрь 22, 2015, 22:53
+ ко всем предыдущим ораторам.

PS вы указали код только клиента, покажите код сервера и вообще сделайте проектик с проблемой.

PPS ниразу не попадал в такую ситуацию, даже с резким выдёргиванием сетевого шнура. Были такие испытания :D


Название: Re: Критический Баг QTcpSocket bind, можно ли обойти ?
Отправлено: qate от Декабрь 23, 2015, 08:39
создал багрепорт https://bugreports.qt.io/browse/QTBUG-50124

собственно сама проблема в коде в файле QIODevicePrivateLinearBuffer::makeSpace:

while (newCapacity < required)
newCapacity *= 2;

где newCapacity равно 0 )



Название: Re: Критический Баг QTcpSocket bind, можно ли обойти ?
Отправлено: Fat-Zer от Декабрь 23, 2015, 12:19
ради интереса, а в силу какой чёрной магии оно нулём оказалась? и, как я понимаю, QIODEVICE_BUFFERSIZE тоже...


Название: Re: Критический Баг QTcpSocket bind, можно ли обойти ?
Отправлено: qate от Декабрь 23, 2015, 12:45
ради интереса, а в силу какой чёрной магии оно нулём оказалась? и, как я понимаю, QIODEVICE_BUFFERSIZE тоже...

проблемы начались ранее в QAbstractSocketPrivate::readFromSocket, там есть вызов buffer.reserve(bytesToRead) со значением bytesToRead == -1
смысл в том, что данных вообще нет в канале т.к. на SYN сразу был получен отлуп, а был вызван canReadNotification (видимо решил дочитать остатки)
как я это понял


Название: Re: Критический Баг QTcpSocket bind, можно ли обойти ?
Отправлено: qate от Декабрь 25, 2015, 09:19
Поправили