【问题标题】:Qt TCP/IP socket connection checkQt TCP/IP 套接字连接检查
【发布时间】:2014-04-08 15:01:12
【问题描述】:

我正在编写 Qt TCP/IP 客户端。我想在将数据发送到服务器之前检查与服务器的连接状态。 据我所知,我可以通过以下方法做到这一点

  • 使用 bool 'ConnectionState',连接时设置此变量 在 disconnected() 信号上切断并重置此变量。现在以前 向服务器发送数据(client->write())检查 this 的值 多变的。
  • 使用这种 'client->state() == QTcpSocket::ConnectedState' 方式来检查连接状态。

这是一个很好的做法。或任何其他方法。

提前致谢。

【问题讨论】:

  • this answer 中描述了一种可能的方法。但这不是 Qt 的方式。 @beparas,为 error(SocketError) 信号创建一个插槽对你有用。对我来说,它不像接受的答案中描述的那样工作。

标签: qt sockets tcp


【解决方案1】:

QTCPSocket 派生自QAbstractSocket,它提供了一个state() 函数。这将返回以下枚举之一:-

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

因此,假设 m_pSocket 是 QTcpSocket,您只需执行此操作即可检查它是否已连接:-

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

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

【讨论】:

【解决方案2】:

您可以使用errorOccurred 信号,并且此信号在客户端中定义一个插槽就足够了。发生错误时,触发信号,您可以在槽函数中接收通知。

在client.h中

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

在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"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-06
    • 2010-09-15
    • 2012-07-30
    • 2013-06-29
    • 2015-05-15
    • 2011-08-31
    相关资源
    最近更新 更多