Qtcpserver возвращает неизвестную ошибку в функции прослушивания только в отладчике

Когда я пытаюсь прослушивать любой порт с помощью QTcpServer и запускаю приложение под отладчиком, я всегда получаю сообщение «Неизвестная ошибка». Когда я запускаю эту программу без отладчика - все выглядит хорошо.

#include <QCoreApplication>
#include <QTcpServer>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QTcpServer srv;
    bool r = srv.listen();
    qDebug() << srv.errorString();
    return r;
}

Позже я нашел этот отчет об ошибке, но он закрыт, и эти строки также не работает:

bool r = srv.listen(QHostAddress("127.0.0.1")); //ok
bool r = srv.listen(QHostAddress::AnyIPv4); //ok
bool r = srv.listen(QHostAddress::AnyIPv6);// ok
bool r = srv.listeb(QHostAddress::Any); //not ok

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

P.S.

Qt Creator 4.0.2 Qt 5.7.0 (MSVC 2013, 32-разрядная версия), версия 47b4f2c738


person murzagurskiy    schedule 03.02.2018    source источник


Ответы (2)


Я столкнулся с этой проблемой при отладке проекта CMake в Visual Studio 2017. Для отладки проблемы я использовал следующие строки:

WSAData wsadata;
int startupResult = WSAStartup(MAKEWORD(2, 0), &wsadata);
SOCKET socket = ::WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED);
int error = WSAGetLastError();

(Включил winsock2.h и добавил эту строку в CMakeLists.txt: target_link_libraries(${PROJECT_NAME} PRIVATE ws2_32))

Значение error было 10106 (WSAEPROVIDERFAILEDINIT). Я нашел этот ответ, в котором говорится, что переменная среды SystemRoot не устанавливается.

Действительно, почему-то при отладке проекта CMake в Visual Studio 2017 в программу не передавались никакие переменные окружения. Таким образом, переменная окружения SystemRoot была пустой. Я определил переменную среду в файле launch.vs.json, и проблема решена.

Пример файла launch.vs.json:

{
  "version": "0.2.1",
  "defaults": {},
  "configurations": [
    {
      "type": "default",
      "project": "CMakeLists.txt",
      "projectTarget": "SomeProject.exe",
      "name": "SomeProject.exe",
      "env": "PATH=${env.QT_DIR}\\bin;${env.QT_DIR}\\plugins\\platform;${env.PATH}\u0000TEMP=C:\\Users\\SomeUser\\AppData\\Local\\Temp\u0000SystemRoot=C:\\Windows"
    }
  ]
}
person Yusuf Tarık Günaydın    schedule 10.03.2019

Почему вы используете HostAddress::AnyIPv4 и HostAddress::AnyIPv6 и после этого используете все? Может просто запустить со всеми QHostAddress::Any.

person Artmetic    schedule 03.02.2018