Qt Network를 이용한 네트워크 프로그래밍
Qt Network 모듈은 TCP/IP 클라이언트 및 서버를 작성할 수 있는 클래스를 제공합니다. 이 모듈은 저수준 네트워크 개념을 나타내는 QTcpSocket, QTcpServer, QUdpSocket 과 같은 저수준 클래스와, 일반적인 프로토콜을 사용하여 네트워크 작업을 수행하는 QNetworkRequest, QNetworkReply, QNetworkAccessManager 과 같은 고수준 클래스를 제공합니다.
Qt Network 또한 네이티브 TLS 백엔드, OpenSSL 툴킷 또는 적절한 TLS 플러그인을 사용하여 TLS(Transport Layer Security) 및 보안 기능을 위한 API를 제공합니다. 자세한 내용은 SSL(Secure Sockets Layer) 클래스를 참조하십시오.
네트워크 프로그래밍을 위한 Qt 클래스
이 Qt Network C++ Classes 페이지에는 ` Qt Network`에 포함된 C++ 클래스 목록이 나와 있습니다.
HTTP를 위한 고수준 네트워크 작업
네트워크 액세스 API는 일반적인 네트워크 작업을 수행하기 위한 클래스 모음입니다. 이 API는 사용되는 특정 작업 및 프로토콜(예: HTTP를 통한 데이터 가져오기 및 전송) 위에 추상화 계층을 제공하며, 일반적이거나 고수준의 개념에 대한 클래스, 함수 및 신호만 노출합니다.
네트워크 요청은 ` QNetworkRequest ` 클래스로 표현되며, 이 클래스는 헤더 정보나 사용된 암호화 방식 등 요청과 관련된 정보를 담는 일반적인 컨테이너 역할도 합니다. 요청 객체가 생성될 때 지정된 URL이 요청에 사용될 프로토콜을 결정합니다. 현재 업로드 및 다운로드에는 HTTP와 로컬 파일 URL이 지원됩니다.
네트워크 작업의 조정은 ` QNetworkAccessManager ` 클래스에 의해 수행됩니다. 요청이 생성되면 이 클래스를 사용하여 요청을 전달하고 진행 상황을 보고하기 위해 신호를 발산합니다. 또한 이 관리자는 클라이언트에 데이터를 저장하기 위한 ` cookies `, 인증 요청, 프록시 사용을 조정합니다.
네트워크 요청에 대한 응답은 ` QNetworkReply ` 클래스로 표현되며, 이는 요청이 전달될 때 ` QNetworkAccessManager `에 의해 생성됩니다. QNetworkReply 가 제공하는 신호를 사용하여 각 응답을 개별적으로 모니터링할 수 있으며, 개발자는 대신 매니저의 신호를 이 목적으로 사용하고 응답에 대한 참조를 버릴 수도 있습니다. QNetworkReply 는 QIODevice 의 하위 클래스이므로, 응답을 동기식 또는 비동기식으로, 즉 차단형 또는 비차단형 작업으로 처리할 수 있습니다.
각 애플리케이션이나 라이브러리는 네트워크 통신을 처리하기 위해 QNetworkAccessManager 의 인스턴스를 하나 이상 생성할 수 있습니다.
QTcpSocket 및 QTcpServer를 사용한 TCP 활용
TCP(Transmission Control Protocol)는 HTTP 및 FTP를 포함한 대부분의 인터넷 프로토콜에서 데이터 전송에 사용되는 저수준 네트워크 프로토콜입니다. 이는 신뢰성이 높고, 스트림 지향적이며, 연결 지향적인 전송 프로토콜입니다. 특히 데이터의 연속적인 전송에 매우 적합합니다.

QTcpSocket 클래스는 TCP를 위한 인터페이스를 제공합니다. QTcpSocket 를 사용하여 POP3, SMTP, NNTP와 같은 표준 네트워크 프로토콜은 물론 사용자 정의 프로토콜도 구현할 수 있습니다.
데이터 전송을 시작하기 전에 원격 호스트 및 포트에 대한 TCP 연결을 먼저 설정해야 합니다. 연결이 설정되면 QTcpSocket::peerAddress() 및 QTcpSocket::peerPort()을 통해 상대방의 IP 주소와 포트를 확인할 수 있습니다. 상대방은 언제든지 연결을 종료할 수 있으며, 이 경우 데이터 전송은 즉시 중단됩니다.
QTcpSocket QNetworkAccessManager 와 마찬가지로 비동기 방식으로 작동하며, 상태 변경 및 오류를 보고하기 위해 신호를 발생시킵니다. 이 소켓은 이벤트 루프를 통해 수신 데이터를 감지하고, 발신 데이터를 자동으로 플러시합니다. ()을 사용하여 소켓에 데이터를 쓸 수 있으며, ()을 사용하여 데이터를 읽을 수 있습니다. 는 읽기용과 쓰기용, 두 개의 독립적인 데이터 스트림을 나타냅니다. QTcpSocket::write QTcpSocket::read QTcpSocket
QTcpSocket 는 QIODevice 를 상속받으므로, QTextStream 및 QDataStream 와 함께 사용할 수 있습니다. QTcpSocket 에서 데이터를 읽을 때는, 미리 QTcpSocket::bytesAvailable()를 호출하여 충분한 데이터가 준비되어 있는지 확인해야 합니다.
수신 TCP 연결을 처리해야 하는 경우(예: 서버 애플리케이션에서), QTcpServer 클래스를 사용하십시오. QTcpServer::listen()를 호출하여 서버를 설정하고, 연결되는 각 클라이언트마다 한 번씩 발생되는 QTcpServer::newConnection() 신호에 연결하십시오. 슬롯 내에서 QTcpServer::nextPendingConnection()를 호출하여 연결을 수락하고, 반환된 QTcpSocket 를 사용하여 클라이언트와 통신하십시오.
대부분의 함수는 비동기적으로 작동하지만, QTcpSocket 를 동기적으로(즉, 차단 방식으로) 사용할 수도 있습니다. 블로킹 동작을 얻으려면 QTcpSocket 의 waitFor...() 함수를 호출하십시오. 이 함수들은 신호가 발생될 때까지 호출 스레드를 일시 중지합니다. 예를 들어, 비블로킹 QTcpSocket::connectToHost() 함수를 호출한 후, QTcpSocket::waitForConnected()를 호출하여 connected() 신호가 발생할 때까지 스레드를 블로킹할 수 있습니다.
동기식 소켓을 사용하면 제어 흐름이 더 단순한 코드를 작성할 수 있는 경우가 많습니다. waitFor...() 방식의 주요 단점은 waitFor...() 함수가 차단되어 있는 동안 이벤트가 처리되지 않는다는 점입니다. GUI 스레드에서 이 방식을 사용하면 애플리케이션의 사용자 인터페이스가 멈출 수 있습니다. 이러한 이유로, 동기식 소켓은 비-GUI 스레드에서만 사용할 것을 권장합니다. 동기식으로 사용할 경우, QTcpSocket 는 이벤트 루프가 필요하지 않습니다.
Fortune Client 및 Fortune Server 예제는 QTcpSocket 와 QTcpServer 를 사용하여 TCP 클라이언트-서버 애플리케이션을 작성하는 방법을 보여줍니다. 별도의 스레드에서(이벤트 루프를 사용하지 않고) 동기식 QTcpSocket 를 사용하는 예제는 ‘Blocking Fortune Client’를, 활성 클라이언트마다 하나의 스레드를 사용하는 멀티스레드 TCP 서버의 예제는 ‘Threaded Fortune Server’를 참조하십시오.
QUdpSocket을 사용한 UDP
UDP(User Datagram Protocol)는 경량이며, 비신뢰성, 데이터그램 지향, 비연결형 프로토콜입니다. 신뢰성이 중요하지 않은 경우에 사용할 수 있습니다. 예를 들어, 현재 시간을 알려주는 서버는 UDP를 선택할 수 있습니다. 현재 시간이 포함된 데이터그램이 손실되더라도 클라이언트는 간단히 다시 요청하면 됩니다.

QUdpSocket 클래스를 사용하면 UDP 데이터그램을 송수신할 수 있습니다. 이 클래스는 QAbstractSocket 를 상속받으므로 QTcpSocket 의 인터페이스 대부분을 공유합니다. 주요 차이점은 QUdpSocket 가 데이터를 연속적인 데이터 스트림이 아닌 데이터그램 단위로 전송한다는 점입니다. 간단히 말해, 데이터그램은 크기가 제한된(일반적으로 512바이트 미만) 데이터 패킷으로, 전송되는 데이터 외에도 데이터그램 발신자와 수신자의 IP 주소 및 포트를 포함합니다.
QUdpSocket IPv4 브로드캐스팅을 지원합니다. 브로드캐스팅은 네트워크에서 어떤 호스트가 가장 많은 여유 하드 디스크 공간을 가지고 있는지 확인하는 것과 같은 네트워크 탐색 프로토콜을 구현하는 데 자주 사용됩니다. 한 호스트가 네트워크로 데이터그램을 브로드캐스팅하면 다른 모든 호스트가 이를 수신합니다. 요청을 수신한 각 호스트는 현재 사용 가능한 디스크 공간의 양을 포함하여 발신자에게 응답을 보냅니다. 발신자는 모든 호스트로부터 응답을 받을 때까지 기다린 후, 데이터를 저장할 여유 공간이 가장 많은 서버를 선택할 수 있습니다. 데이터그램을 브로드캐스팅하려면 특수 주소 QHostAddress::Broadcast (255.255.255.255) 또는 로컬 네트워크의 브로드캐스트 주소로 데이터그램을 전송하기만 하면 됩니다.
QUdpSocket::bind()는 TCP 서버의 QTcpServer::listen()와 마찬가지로, 들어오는 데이터그램을 수신할 수 있도록 소켓을 준비합니다. 하나 이상의 데이터그램이 도착할 때마다 QUdpSocket 는 readyRead() 신호를 발생시킵니다. 데이터그램을 읽으려면 QUdpSocket::readDatagram()를 호출하십시오.
Broadcast Sender 및 Broadcast Receiver 예제는 Qt를 사용하여 UDP 송신기와 UDP 수신기를 작성하는 방법을 보여줍니다.
QUdpSocket 또한 멀티캐스팅도 지원합니다. ‘Multicast Sender’ 및 ‘Multicast Receiver’ 예제는 UDP 멀티캐스트 클라이언트를 작성하는 방법을 보여줍니다.
QHostInfo를 사용한 호스트 이름 확인
네트워크 연결을 설정하기 전에, QTcpSocket 와 QUdpSocket 는 이름 조회를 수행하여 연결하려는 호스트 이름을 IP 주소로 변환합니다. 이 작업은 일반적으로 DNS(도메인 이름 서비스) 프로토콜을 사용하여 수행됩니다.
QHostInfo 는 사용자가 직접 이러한 조회를 수행할 수 있게 해주는 정적 함수를 제공합니다. 호스트 이름, QObject 포인터 및 슬롯 시그니처를 사용하여 QHostInfo::lookupHost()를 호출하면, QHostInfo 는 이름 조회를 수행하고 결과가 준비되면 지정된 슬롯을 호출합니다. 실제 조회는 별도의 스레드에서 수행되며, 운영 체제 자체의 이름 조회 메서드를 활용합니다.
QHostInfo 또한 호스트 이름을 인수로 받아 결과를 반환하는 QHostInfo::fromName()라는 정적 함수도 제공합니다. 이 경우, 이름 조회는 호출자와 동일한 스레드에서 수행됩니다. 이 오버로드는 비 GUI 애플리케이션이나 별도의 비 GUI 스레드에서 이름 조회를 수행하는 데 유용합니다. (GUI 스레드에서 이 함수를 호출하면, 함수가 조회를 수행하는 동안 차단되어 사용자 인터페이스가 멈출 수 있습니다.)
네트워크 프록시 지원
Qt Network를 통한 네트워크 통신은 로컬 및 원격 연결 간의 네트워크 트래픽을 전달하거나 필터링하는 프록시를 통해 수행될 수 있습니다.
개별 프록시는 ` QNetworkProxy ` 클래스로 표현되며, 이 클래스는 프록시와의 연결을 정의하고 구성하는 데 사용됩니다. 다양한 수준의 네트워크 통신에서 작동하는 프록시 유형이 지원되며, SOCKS 5를 통해 저수준에서 네트워크 트래픽 프록시 처리가 가능하고, HTTP 및 FTP 프록시는 프로토콜 수준에서 작동합니다. 자세한 내용은 QNetworkProxy::ProxyType 을 참조하십시오.
프록시 기능은 소켓 단위로 활성화하거나 애플리케이션 내의 모든 네트워크 통신에 대해 활성화할 수 있습니다. 새로 열린 소켓은 연결되기 전에 QAbstractSocket::setProxy() 함수를 호출하여 프록시를 사용하도록 설정할 수 있습니다. QNetworkProxy::setApplicationProxy() 함수를 사용하면 이후의 모든 소켓 연결에 대해 애플리케이션 전체에 프록시 기능을 활성화할 수 있습니다.
프록시 팩토리는 프록시 사용 정책을 생성하는 데 사용됩니다. ` QNetworkProxyFactory `는 특정 프록시 유형에 대한 쿼리를 기반으로 프록시를 제공합니다. 쿼리 자체는 QNetworkProxyQuery 객체에 인코딩되어 있으며, 이를 통해 프록시의 목적(TCP, UDP, TCP 서버, URL 요청), 로컬 포트, 원격 호스트 및 포트, 사용 중인 프로토콜(HTTP, FTP 등)과 같은 주요 기준에 따라 프록시를 선택할 수 있습니다.
QNetworkProxyFactory::proxyForQuery()는 팩토리를 직접 쿼리하는 데 사용됩니다. QNetworkProxyFactory::setApplicationProxyFactory()에 팩토리를 전달하여 애플리케이션 전체에 적용되는 프록시 정책을 구현할 수 있으며, QNetworkProxyFactory 를 서브클래스화하여 사용자 정의 프록시 정책을 생성할 수 있습니다. 자세한 내용은 클래스 문서를 참조하십시오.
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.