博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Qt客户端连接不上Linux服务器?

Posted on 2023-03-15 23:27  swansfight  阅读(207)  评论(0编辑  收藏  举报

1. Qt连接代码

void Client::toConnect()
{
    if (isConnecting || QAbstractSocket::UnconnectedState != tcpSocket->state())
        return;
    tcpSocket->abort();
    tcpSocket->connectToHost(QHostAddress(SERVER_IP), SERVER_PORT);
    tcpSocket->waitForConnected();
}

这里省略Linux处理代码...


2. 问题分析以及解决方法

2.1 服务器IP是否能被Ping通?

打开cmd窗口(①win+r,然后输入cmd回车。②或直接搜索框直接搜索cmd)

ping 服务器地址/域名

2.2 客户端中的服务器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.3 Linux的代码处理是否正确?

自己先在Linux上编写几个客户端测试测试,看看所写的服务器代码是否能够正确处理客户端连接。


2.4 Linux服务器端口是否开放(很重要)?

有两种解决方法:①开放端口;②关闭防火墙

2.4.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

-->Linux防火墙与端口操作命令


实例说明:开放端口7799去用于客户端通信

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

[root@VM-4-2-centos ~]# firewall-cmd --zone=public --add-port=7799/tcp --permanent

第二步:重启一下防火墙

[root@VM-4-2-centos ~]# firewall-cmd --reload

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

image

步骤分析:

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


2.4.2 关闭防火墙(开放所有端口,不推荐!)

这里也有两种方法,第一种麻烦但是相对安全,第二种方便但是很不安全。

方法一:每次通信时都去关闭防火墙

方法二:关闭防火墙之后,再禁用防火墙自启,防止防火墙自启导致端口无法使用

作用 命令
关闭防火墙 systemctl stop firewalld
禁用防火墙自启 systemctl disable firewalld
启动防火墙 systemctl start firewalld
启动防火墙开机自启 systemctl enable firewalld