Russian Qt Forum
Ноябрь 23, 2024, 05:45 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Критический Баг QTcpSocket bind, можно ли обойти ?  (Прочитано 6595 раз)
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« : Декабрь 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 в бесконечном цикле, если удаленный хост сразу порвал соединение (файерволл там стоит например)

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


Записан
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #1 : Декабрь 22, 2015, 19:03 »

Минимальный бы примерчик-проект не помешал. А то лень самому создавать, чтобы поглядеть что там стряслось  Смеющийся
Записан

Гугль в помощь
torwig
Самовар
**
Offline Offline

Сообщений: 134



Просмотр профиля
« Ответ #2 : Декабрь 22, 2015, 22:46 »

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

+ ко всем предыдущим ораторам.

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

PPS ниразу не попадал в такую ситуацию, даже с резким выдёргиванием сетевого шнура. Были такие испытания Веселый
Записан
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #4 : Декабрь 23, 2015, 08:39 »

создал багрепорт https://bugreports.qt.io/browse/QTBUG-50124

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

while (newCapacity < required)
newCapacity *= 2;

где newCapacity равно 0 )

« Последнее редактирование: Декабрь 23, 2015, 08:43 от qate » Записан
Fat-Zer
Гость
« Ответ #5 : Декабрь 23, 2015, 12:19 »

ради интереса, а в силу какой чёрной магии оно нулём оказалась? и, как я понимаю, QIODEVICE_BUFFERSIZE тоже...
Записан
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #6 : Декабрь 23, 2015, 12:45 »

ради интереса, а в силу какой чёрной магии оно нулём оказалась? и, как я понимаю, QIODEVICE_BUFFERSIZE тоже...

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

Сообщений: 1177


Просмотр профиля
« Ответ #7 : Декабрь 25, 2015, 09:19 »

Поправили
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.058 секунд. Запросов: 23.