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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTcpServer в Qt5.5 и IPv6  (Прочитано 8431 раз)
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« : Июль 21, 2015, 13:10 »

1) Есть QTcpServer.
Есть ​listen( QHostAddress::Any, port ).

В Qt 5.4- подключения с IPv4 приходят c адресами вида QHostAddress( "127.0.0.1" ), QHostAddress( "192.168.13.13" ).

В Qt 5.5 подключения с IPv4 приходят c адресами IPv6 вида QHostAddress( "::ffff:127.0.0.1" ), QHostAddress( "::ffff:192.168.13.13" ).

Кто знает это баг или фича? И как теперь правильно проверять, что подключение с разрешённого ip?
Я могу сделать это при помощи toIPv4Address() с проверкой результата на 0, но как то уж больно это костыльно…

2) Нубский вопрос по IPv6.
QHostAddress( "fe80::61f4:7c:796d:7ccc%10" ) - %10 это что? Подсеть?

Со вторым вопросом разобрался. Это scopeId().
« Последнее редактирование: Июль 21, 2015, 15:18 от LisandreL » Записан
Bepec
Гость
« Ответ #1 : Июль 21, 2015, 13:34 »

1) QHostAddress::protocol () const
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #2 : Июль 21, 2015, 14:52 »

1) QHostAddress::protocol () const
И?.. Про функцию знаю, как она мне должна помочь не знаю.

Код
C++ (Qt)
QHostAddress( "127.0.0.1" ).protocol() == QAbstractSocket::IPv4Protocol
QHostAddress( "::ffff:127.0.0.1" ).protocol() == QAbstractSocket::IPv6Protocol
QHostAddress( "127.0.0.1" ).protocol() != QHostAddress( "::ffff:127.0.0.1" ).protocol()
QHostInfo::fromName( "localhost" ).addresses() == (QHostAddress("::1"), QHostAddress("127.0.0.1")) // никакого ::ffff:127.0.0.1
« Последнее редактирование: Июль 21, 2015, 15:26 от LisandreL » Записан
Bepec
Гость
« Ответ #3 : Июль 22, 2015, 12:50 »

Кто его знает, мб это баг 5.5. Или же у вас ipv6 включен в свойствах карточки. Лезьте в сырцы, смотрите.

PS 5.5 не установлен, увы.
Записан
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #4 : Июль 22, 2015, 13:27 »

Код
C++ (Qt)
listen(QHostAddress::AnyIPv4, port )

а еще в 550 забавно поломали qDebug )
https://bugreports.qt.io/browse/QTBUG-46196
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #5 : Июль 22, 2015, 14:36 »

Код
C++ (Qt)
listen(QHostAddress::AnyIPv4, port )
Да, я знаю, что с AnyIPv4 работает «как раньше».
Просто я и v6 соединения принимаю (хоть это и не сильно востребовано).
Можно, наверно открыть 2 сервера с listen(QHostAddress::AnyIPv4, port ) и listen(QHostAddress::AnyIPv6, port ), но как -то это уж совсем костыльно. Лучше уж проверку адресов переделать, благо toIPv4Address на такие адреса работает.

Лезьте в сырцы, смотрите.
Не вижу смысла. Ну найду я изменения, что дальше? Патчить каждую следующую версию Qt сомнительное удовольствие.
Оформил репорт, если скажут, что баг, запрещу собираться под этой версией. Если что фича - адаптирую код.
Записан
lesav
Частый гость
***
Offline Offline

Сообщений: 235


qnx.org.ru


Просмотр профиля WWW
« Ответ #6 : Октябрь 25, 2015, 22:45 »

Не знаю, баг ли это, но Qt5 упрямо выдает адреса в формате IPv6. В своем проекте воткнул вот такой костыль
Код
C++ (Qt)
QString jCjSHttpConnection::peerAddress()
{
   if(!m_pSocket) { return "0.0.0.0"; }
#if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0))
   return QHostAddress(m_pSocket->peerAddress().toIPv4Address()).toString();
#else
   return m_pSocket->peerAddress().toString();
#endif
}
Записан

Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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