QTcpSocket描述符错误
我试图学习一些关于TCP服务器和套接字的知识,但在这种情况下我陷入了困境。我正在创建服务器并将套接字连接到它。但我无法为这些套接字获取正确的描述符。但是,当我检查nextPendingConnection时,它有正确的描述符 下面是一个简单的代码:QTcpSocket描述符错误,qt,tcpserver,Qt,Tcpserver,我试图学习一些关于TCP服务器和套接字的知识,但在这种情况下我陷入了困境。我正在创建服务器并将套接字连接到它。但我无法为这些套接字获取正确的描述符。但是,当我检查nextPendingConnection时,它有正确的描述符 下面是一个简单的代码: QTcpServer server; server.listen(QHostAddress::LocalHost, 2500); QObject::connect(&server, &QTcpServer::newConnectio
QTcpServer server;
server.listen(QHostAddress::LocalHost, 2500);
QObject::connect(&server, &QTcpServer::newConnection, [&] {
qDebug()<<"New connection recieved!";
QTcpSocket* connection = server.nextPendingConnection();
qDebug()<<"socket descriptor: "<<connection->socketDescriptor(); // here i have some correct descriptor
connection->waitForReadyRead();
});
QTcpSocket *s = new QTcpSocket;
qDebug()<<s->socketDescriptor(); // here i get -1
s->connectToHost(QHostAddress::LocalHost, 2500);
qDebug()<<s->socketDescriptor(); // and here i get -1
qtcserver服务器;
listen(QHostAddress::LocalHost,2500);
QObject::connect(&server,&QTcpServer::newConnection,[&]{
qDebug()由于套接字尚未连接,因此得到-1。在声明qtcsocket*s=new qtcsocket;后添加此项,您将看到一个有效的描述符:
QObject::connect(s, &QTcpSocket::connected, [&] {
qDebug()<<"socket descriptor (c): "<<s->socketDescriptor();
});
QObject::connect(s,&qtcsocket::connected,[&]{
罗尔夫,我像你说的那样试过了。但是信号甚至没有发出
QTcpSocket *s = new QTcpSocket;
QObject::connect(s, &QTcpSocket::connected, [&] {
qDebug()<<" --- socket descriptor (c): "<<s->socketDescriptor();
});
s->connectToHost(QHostAddress::LocalHost, 2500);
QTcpSocket*s=新的QTcpSocket;
QObject::connect(s,&QTcpSocket::connect,[&]{
qDebug()奇怪,测试很快(在MacOS上),它对我很有效:套接字描述符:3套接字描述符(c):21你可以用Wireshark检查三方握手是否通过,以及一些系统工具(取决于你的操作系统)操作系统认为套接字状态是什么。嘿,Rolf,在添加“waitForConnected”后,我有了新情况。下面是代码:s->connectToHost(QHostAddress::LocalHost,2500);if(!s->waitForConnected(5000)){qDebug()很抱歉,我以前没有看到这一点,因为我在以前的试用中没有使用它。你不应该使用waitForReadyRead之类的。它们正在阻止呼叫!你确实需要使用信号和插槽,并连接到ready read信号。我想这应该可以解决这一问题。
QObject::connect(s, &QTcpSocket::stateChanged, [&] {
qDebug()<<" --- socket state (c): "<<s->state();
});