目录
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