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

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

#include

#include

#include

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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值