Qt TCP/IP套接字连接检查

7
我正在编写Qt TCP/IP客户端。我想在向服务器发送数据之前检查连接状态。 据我所知,可以通过以下方法来实现:
- 使用布尔变量“ConnectionState”,当与服务器连接时设置此变量,并在“disconnected()”信号上重置此变量。现在,在向服务器发送数据(client->write())之前,检查此变量的值。 - 使用“client->state() == QTcpSocket :: ConnectedState”方式来检查连接状态。
以上两种方法都是不错的做法。还有其他方法吗?
提前感谢。

一种可能的方法在这个答案中有所描述。但这不是Qt的方式。@beparas,为error(SocketError)信号创建一个槽是否对你有用?对我来说,它并没有像被接受的答案中所描述的那样工作。 - iammilind
2个回答

15

QTCPSocket继承自QAbstractSocket,后者提供了一个state()函数,它返回以下枚举值之一:-

enum SocketState { UnconnectedState, HostLookupState, ConnectingState, ConnectedState, ..., ListeningState }

假设m_pSocket是一个QTcpSocket,你可以简单地这样检查它是否已连接:

所以,假设m_pSocket是一个QTcpSocket,你只需要这样做来检查它是否连接:

bool connected = (m_pSocket->state() == QTcpSocket::ConnectedState);

你可以添加一个布尔值来跟踪状态,但如果发生网络错误,你需要确保它始终与实际连接状态同步。


1
将一个槽连接到错误信号:void error(QAbstractSocket :: SocketError socketError) - TheDarkKnight
我已经将一个插槽连接到error(SocketError)信号,但即使Wifi被关闭,它也从未被调用。以下语句对此没有任何影响:setSocketOption(QAbstractSocket::LowDelayOption, true)setSocketOption(QAbstractSocket::KeepAliveOption, true)。我是否漏掉了什么? - iammilind
@iammilind,我建议您在SO上提出一个单独的问题,并使用MCVE - TheDarkKnight
Qt:为什么在网络断开连接时不会触发QAbstractSocket::error(QAbstractSocket::SocketError)信号? - iammilind

0

您可以使用errorOccurred信号,只需在客户端中定义一个槽即可。当发生错误时,信号会触发并且您可以在槽函数中接收通知。

在client.h文件中:

/* define a slot for client */
public slots:
    void errorOccurred(QAbstractSocket::SocketError error);

In client.c

/*client constructor*/
Client::Client(QObject *parent) {
/*some other code here*/
    connect(socket, SIGNAL(errorOccurred(QAbstractSocket::SocketError)),
        this, SLOT(errorOccurred(QAbstractSocket::SocketError)));

/*and maybe some other code here*/
}

在client.c中编写errorOccurred的实现:
void Client::errorOccurred(QAbstractSocket::SocketError error) {
    qDebug() << "error in connection: " << socket->errorString();
}

输出:

error in connection:  "Connection refused"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接