記事ディレクトリ
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) 最初のパラメータ: QString 形式の IP、2 番目のパラメータ: quint16 のパラメータ、および最後の 2 つのパラメータは入力する必要はありません。
[virtual] void QAbstractSocket::connectToHost(
const QString &hostName,
quint16 port,
QIODevice::OpenMode openMode = ReadWrite,
QAbstractSocket::NetworkLayerProtocol protocol = AnyIPProtocol)
(2) 最初のパラメータ: QHostAddress 形式の 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-port
2) 3 番目の手順だけを実行すると、サーバーによって追加されたファイアウォール ルールが見つからないため、接続できません。
方法 2: ファイアウォールをオフにしてポートを開きます。
ファイアウォール コマンドをオフにします。systemctl stop firewalld
また
ファイアウォールのセルフスタートを直接無効にする: systemctl disable firewalld
— ファイアウォールのセルフスタートによってポートが使用不能になるのを防ぎます。
回復操作:
ファイアウォール コマンドを開始します。systemctl start firewalld
起動時にファイアウォールが自動的に起動するようにします。systemctl enable firewalld