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 от имени администратора, перезагрузить компьютер, изменить порт и адрес, найти возможные открытые порты... Ничего не помогает.
PS
Qt Creator 4.0.2 Qt 5.7.0 (MSVC 2013, 32 бита), редакция 47b4f2c738
1 ответ
Я видел эту проблему при отладке проекта 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"
}
]
}
Почему вы используете HostAddress::AnyIPv4 и HostAddress::AnyIPv6 и после этого используете все? Может быть, просто запустить со всеми QHostAddress::Any.