C++ 네트워크 프로그래밍 1일차
네트워크 프로그래밍은 여러 컴퓨터 간의 통신을 통해 데이터를 주고받는 기술입니다. C++로 네트워크 프로그래밍을 시작하려면 기본 개념들을 탄탄히 다지는 것이 중요합니다. 이번 포스팅에서는 서버-클라이언트 구조, 소켓(Socket), 그리고 통신 프로토콜(TCP/UDP/IP) 등의 기초 내용을 정리해보겠습니다.
1. 네트워크 프로그래밍의 개요
네트워크 프로그래밍은 다양한 시스템 간의 데이터 통신을 구현하는 기술입니다. 이를 통해 웹 서비스, 파일 전송, 실시간 채팅, 온라인 게임 등 여러 분야에 응용할 수 있습니다.
2. 서버와 클라이언트 구조
네트워크 애플리케이션은 보통 서버-클라이언트 모델을 따릅니다.
- 서버(Server)
- 역할: 클라이언트의 요청을 받아들이고 처리하는 중앙 집중식 시스템.
- 특징: 특정 포트에서 대기하며, 동시에 여러 클라이언트를 처리하기 위해 멀티스레드나 비동기 I/O를 사용.
- 클라이언트(Client)
- 역할: 서버에 접속하여 데이터를 요청하거나 전송하는 역할.
- 특징: 서버의 응답을 받아 후속 작업을 수행.
서버-클라이언트 구조는 중앙에서 관리하는 방식으로 확장성과 유지보수가 용이합니다.
3. 소켓(Socket): 네트워크 통신의 핵심
소켓(Socket) 은 네트워크 상의 통신 끝점(endpoint) 으로, 데이터를 주고받기 위한 기본 단위입니다.
주요 소켓 함수 (BSD 소켓 API 기준)
socket(): 새로운 소켓을 생성합니다.
bind(): 소켓에 IP 주소와 포트 번호를 할당합니다.
listen(): 서버 소켓을 연결 요청 대기 상태로 전환합니다.
accept(): 클라이언트의 연결 요청을 받아 새로운 소켓을 반환합니다.
connect(): 클라이언트가 서버에 연결 요청을 보냅니다.
send() / recv(): 데이터 송수신에 사용됩니다.
소켓의 종류
- 스트림 소켓 (Stream Socket)
- TCP 기반, 연결 지향적이며 신뢰성 있는 데이터 전송을 지원합니다.
- 데이터그램 소켓 (Datagram Socket)
- UDP 기반, 비연결형으로 빠른 전송이 가능하지만 신뢰성은 낮을 수 있습니다.
4. 통신 프로토콜: IP, TCP, UDP
네트워크 통신은 여러 프로토콜을 기반으로 이루어집니다. 여기서 중요한 역할을 하는 것이 IP, TCP, UDP 입니다.
IP (Internet Protocol)
- 역할: 네트워크 상의 패킷 전달을 담당.
- 특징: 각 장치에 할당된 IP 주소를 통해 데이터그램을 목적지까지 전달하며, 신뢰성보다는 최선의 노력(best effort) 방식을 사용합니다.
TCP (Transmission Control Protocol)
- 특징: 연결 지향적 프로토콜로, 3-way 핸드셰이크를 통해 연결을 수립하고 데이터 전송의 신뢰성(재전송, 순서 보장 등)을 보장합니다.
- 사용 예: HTTP, FTP, SMTP 등 신뢰성이 중요한 애플리케이션.
UDP (User Datagram Protocol)
- 특징: 비연결형 프로토콜로, 빠른 데이터 전송이 가능하지만 전송 순서나 신뢰성은 보장되지 않습니다.
- 사용 예: 온라인 게임, 스트리밍, 실시간 통신 등 빠른 전송이 필요한 경우.
5. C++에서 네트워크 프로그래밍 시작하기
C++로 네트워크 프로그래밍을 진행할 때는 운영체제에 따라 제공되는 소켓 라이브러리나, 크로스 플랫폼 라이브러리를 사용할 수 있습니다.
운영체제 별 API
- Windows: WinSock API
- Unix/Linux/Mac: Berkeley Sockets API
크로스 플랫폼 라이브러리
- Boost.Asio
- 비동기 I/O를 지원하며 TCP, UDP 소켓뿐만 아니라 타이머, 직렬 포트 등 다양한 기능 제공.
- POCO
- 네트워킹, 파일 I/O 등 여러 기능을 아우르는 라이브러리.