Qtcpserver仅在调试器下返回listen函数的未知错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qtcpserver仅在调试器下返回listen函数的未知错误相关的知识,希望对你有一定的参考价值。

当我尝试用QTcpServer监听任何端口,并在调试器下运行app时,我总是得到“未知错误”。当我在没有调试器的情况下运行这个程序时 - 一切都很好。

#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;
}

后来,我发现了this bug报告,但是它关闭了,这条线路也不起作用:

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作为管理员,重新启动计算机,更改端口和地址,搜索可能的开放端口...没有任何帮助。

附:

Qt Creator 4.0.2 Qt 5.7.0(MSVC 2013,32位)修订版47b4f2c738

答案

我在Visual Studio 2017下调试CMake项目时看到了这个问题。我使用以下行调试问题:

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)。我发现this回答说没有设置SystemRoot环境变量。

实际上,出于某种原因,在Visual Studio 2017中调试CMake项目时,没有任何环境变量被传递给程序。所以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\Tempu0000SystemRoot=C:\Windows"
    }
  ]
}
另一答案

为什么你使用HostAddress :: AnyIPv4和HostAddress :: AnyIPv6,之后使用all?也许只运行所有QHostAddress :: Any。

以上是关于Qtcpserver仅在调试器下返回listen函数的未知错误的主要内容,如果未能解决你的问题,请参考以下文章

QT QTcpServer newConnection 信号无法触发 槽

QT QTcpServer newConnection 信号无法触发 槽

QTcpServer服务器无法监听和客户端连接不上问题

Qt 5.8 QTcpServer 无法监听局域网 ip 地址问题

Qt下TCP编程

49.Qt-网络编程之QTCPSocket和QTCPServer(实现简易网络调试助手)