Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
QTcpSocket描述符错误_Qt_Tcpserver - Fatal编程技术网

QTcpSocket描述符错误

QTcpSocket描述符错误,qt,tcpserver,Qt,Tcpserver,我试图学习一些关于TCP服务器和套接字的知识,但在这种情况下我陷入了困境。我正在创建服务器并将套接字连接到它。但我无法为这些套接字获取正确的描述符。但是,当我检查nextPendingConnection时,它有正确的描述符 下面是一个简单的代码: QTcpServer server; server.listen(QHostAddress::LocalHost, 2500); QObject::connect(&server, &QTcpServer::newConnectio

我试图学习一些关于TCP服务器和套接字的知识,但在这种情况下我陷入了困境。我正在创建服务器并将套接字连接到它。但我无法为这些套接字获取正确的描述符。但是,当我检查nextPendingConnection时,它有正确的描述符

下面是一个简单的代码:

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();
    });