¿Qt no puede conectarse al servidor Linux?

1. Código de conexión 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();
}

El código de procesamiento de Linux se omite aquí...


2. Análisis de problemas

2.1 Si la ip y el puerto están correctamente rellenados

Los prototipos de funciones de las dos funciones que se conectan al servidor en Qt:

Nota: quint16 = corto sin firmar

(1) El primer parámetro: IP en forma de QString, el segundo parámetro: el parámetro de quint16, y los dos últimos parámetros no necesitan completarse.

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

(2) El primer parámetro: IP en forma de QHostAddress, el segundo parámetro: el parámetro de quint16 (quint16 = corto sin firmar), y los dos últimos parámetros no necesitan ser llenados.

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

2.2 Si el procesamiento de código de Linux es correcto

Aquí escribo varias pruebas de prueba de cliente en Linux


2.3 El puerto del servidor Linux no está abierto (¡esto es muy importante!)

Hay varias formas de rechazar

Método 1: abrir el puerto de una vez por todas

Primero enumere los comandos que deben usarse:

(1) Ver todos los puertos abiertos

firewall-cmd --list-port

(2) Comprobar si un puerto está abierto

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

(3) Abra el puerto

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

(4) Retire el puerto

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

(5) Reinicie el cortafuegos

firewall-cmd --reload

Ejemplo: Por ejemplo, quiero abrir el puerto 7799

Paso 1: Abra el puerto 7799 para la comunicación TCP

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

Paso 2: reinicia el cortafuegos

firewall-cmd --reload

Paso 3: Agregue las reglas de firewall del servidor, si no realiza este paso, no podrá conectarse

inserte la descripción de la imagen aquí

Análisis de pasos:

1) Si no realiza el tercer paso, no podrá conectarse, porque no se agregaron las reglas de firewall del servidor.

2) Si solo realiza el tercer paso, no podrá conectarse, porque no puede firewall-cmd --list-portencontrar las reglas de firewall agregadas por el servidor.

Método 2: apague el firewall y abra el puerto

Desactive el comando del cortafuegos:systemctl stop firewalld

o

Deshabilite directamente el inicio automático del firewall: systemctl disable firewalldevite que el inicio automático del firewall provoque que los puertos queden inutilizables

Operación de recuperación:

Inicie el comando del cortafuegos:systemctl start firewalld

Habilite el firewall para que se inicie automáticamente en el momento del arranque:systemctl enable firewalld


Supongo que te gusta

Origin blog.csdn.net/CSDN_Yuanyuan/article/details/129573415
Recomendado
Clasificación