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和port是否填写正确

Qt中连接服务器的两个函数的函数原型:

注:quint16 = unsigned short

(1)第一个参数:QString形式的IP,第二个参数:quint16的参数,最后两个参数不需要填。

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

(2)第一个参数:QHostAddress形式的IP,第二个参数:quint16的参数(quint16 = unsigned short),最后两个参数不需要填。

[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

第一步: 开放端口7799用于TCP通信

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

第二步: 重启一下防火墙

firewall-cmd --reload

第三步: 添加服务器的防火墙规则,这一步不弄也是连接不上的

在这里插入图片描述

步骤分析:

1)第三步不弄的话也是连接不上的,因为没添加务器的防火墙规则。

2)如果只是弄了第三步,那也是连接不上的,因为使用firewall-cmd --list-port是查不到服务器添加的防火墙规则。

方法2:关闭防火墙,去开放端口

关闭防火墙命令: systemctl stop firewalld

或者

直接禁用防火墙自启: systemctl disable firewalld — 防止防火墙自启导致端口无法使用

恢复操作:

启动防火墙命令: systemctl start firewalld

启动防火墙开机自启: systemctl enable firewalld


猜你喜欢

转载自blog.csdn.net/CSDN_Yuanyuan/article/details/129573415
今日推荐