Qt は Linux サーバーに接続できませんか?

1.Qt接続コード

void Client::toConnect()
{
    
    
    if (isConnecting || QAbstractSocket::ConnectingState == tcpSocket->state())
        return;
    //    tcpSocket->abort();
    QString ip = SERVER_IP;
    quint16 port = SERVER_PORT;
    //	 qDebug()<<"服务器IP:"<<ip<<", 端口号:"<<port;
    tcpSocket->connectToHost(QHostAddress(ip), port); //核心语句
    //    tcpSocket->waitForConnected();
}

Linux の処理コードはここでは省略します。


2. 問題分析

2.1 IP とポートが正しく入力されているかどうか

Qt でサーバーに接続する 2 つの関数の関数プロトタイプ:

注:quint16 = unsigned short

(1) 最初のパラメータ: Q​​String 形式の IP、2 番目のパラメータ: quint16 のパラメータ、および最後の 2 つのパラメータは入力する必要はありません。

[virtual] void QAbstractSocket::connectToHost(
						const QString &hostName, 
						quint16 port, 
						QIODevice::OpenMode openMode = ReadWrite, 
						QAbstractSocket::NetworkLayerProtocol protocol = AnyIPProtocol)

(2) 最初のパラメータ: Q​​HostAddress 形式の IP、2 番目のパラメータ: quint16 (quint16 = unsigned short) のパラメータ、および最後の 2 つのパラメータは入力する必要はありません。

[virtual] void QAbstractSocket::connectToHost(
						const QHostAddress &address, 
						quint16 port, 
						QIODevice::OpenMode openMode = ReadWrite)

2.2 Linuxのコード処理は正しいか

ここでは、Linux 上でいくつかのクライアント テスト テストを作成します。


2.3 Linux サーバーのポートが開いていない (これは非常に重要です!)

断る方法はいくつかある

方法 1: ポートを完全に開きます

まず、使用する必要があるコマンドをリストします。

(1) 開いているすべてのポートを表示する

firewall-cmd --list-port

(2) ポートが開いているか確認する

firewall-cmd --query-port=端口号/协议(tcp/udp)

(3) ポートを開く

firewall-cmd --zone=public --add-port=端口号/协议(tcp/udp) --permanent

(4) ポートを削除する

firewall-cmd --zone=public --remove-port=端口号/协议(tcp/udp) --permanent

(5) ファイアウォールを再起動する

firewall-cmd --reload

例: たとえば、ポート 7799 を開きたいとします。

ステップ 1: TCP 通信用にポート 7799 を開く

firewall-cmd --zone=public --add-port=7799/tcp --permanent

ステップ 2:ファイアウォールを再起動する

firewall-cmd --reload

ステップ 3:サーバーのファイアウォール ルールを追加します。このステップを実行しない場合、接続できません。

ここに画像の説明を挿入

ステップ分析:

1) 3 番目の手順を行わないと、サーバーのファイアウォール ルールが追加されていないため、接続できません。

firewall-cmd --list-port2) 3 番目の手順だけを実行すると、サーバーによって追加されたファイアウォール ルールが見つからないため、接続できません。

方法 2: ファイアウォールをオフにしてポートを開きます。

ファイアウォール コマンドをオフにします。systemctl stop firewalld

また

ファイアウォールのセルフスタートを直接無効にする: systemctl disable firewalld— ファイアウォールのセルフスタートによってポートが使用不能になるのを防ぎます。

回復操作:

ファイアウォール コマンドを開始します。systemctl start firewalld

起動時にファイアウォールが自動的に起動するようにします。systemctl enable firewalld


おすすめ

転載: blog.csdn.net/CSDN_Yuanyuan/article/details/129573415