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를 열고 싶습니다.

1단계: TCP 통신을 위해 포트 7799 열기

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

2단계: 방화벽 다시 시작

firewall-cmd --reload

3단계: 서버의 방화벽 규칙을 추가합니다. 이 단계를 수행하지 않으면 연결할 수 없습니다.

여기에 이미지 설명 삽입

단계 분석:

1) 세 번째 단계를 수행하지 않으면 서버의 방화벽 규칙이 추가되지 않았기 때문에 접속할 수 없습니다.

firewall-cmd --list-port2) 세 번째 단계만 수행하면 서버에서 추가한 방화벽 규칙을 찾을 수 없기 때문에 연결할 수 없습니다 .

방법 2: 방화벽을 끄고 포트를 엽니다.

방화벽 명령을 끕니다.systemctl stop firewalld

또는

방화벽 자체 시작을 직접 비활성화합니다. systemctl disable firewalld— 방화벽 자체 시작으로 인해 포트를 사용할 수 없게 되는 것을 방지합니다.

복구 작업:

방화벽 명령을 시작합니다.systemctl start firewalld

부팅 시 방화벽이 자동으로 시작되도록 활성화:systemctl enable firewalld


추천

출처blog.csdn.net/CSDN_Yuanyuan/article/details/129573415