1. 소켓 프로그래밍 개요
[소켓의 개념]

- 네트워크 프로그램을 짤 때, 복잡한 TCP/UDP 내부 프로토콜을 몰라도 응용 프로그램이 전송 계층의 기능을 사용할 수 있게 해주는 인터페이스이다.
- 즉, Layer7에서 Layer4의 주요 기능을 제어할 수 있게 해주는 인터페이스이다.
- 응용프로그램과 TCP 계층을 연결하는 다리 역할을 한다.
[소켓의 종류와 통신 방식]

- AF_UNIX: 유닉스 도메인 소켓. 같은 컴퓨터 내의 프로세스끼리 통신할 때 사용된다.
- AF_INET: 인터넷 소켓. 네트워크를 통해 서로 다른 컴퓨터끼리 통신할 때 사용한다.
- SOCK_STREAM: TCP 사용 (연결형)
- SOCK_DGRAM: UDP 사용 (비연결형)
2. 소켓의 주소체계
주소 = 고유한 id값 → 주소가 소켓 통신을 위해 필요하다. 각 소켓별 주소 구조체가 따로 존재한다.
(1) 유닉스 (AF_UNIX) 주소 체계
- sockaddr_un: AF_UNIX의 주소 체계, 파일경로(sun_path)를 주소로 사용함.

(2) 인터넷 (AF_INET) 주소 체계
- sockaddr_in: AF_INET 용 주소체계, IP주소(sin_addr) + 포트번호(sin_port) 조합을 주소로 사용한다.

(3) 통합 주소 체계
- `bind` 같은 함수는 sockaddr_un이나 sockaddr_in을 가리지 않고 받을 수 있어야 하므로, 함수 호출시 (struct sockaddr *) 통합 주소 체계 구조체로 강제 형변환 해서 전달한다.

3. 소켓 시스템 콜 (핵심 함수)
(1) 기본 함수
- int s = socket(int domain, int type, int protocol) @서버 및 클라이언트에서 실행
: 소켓을 생성하고 성공시 소켓 디스크립터(정수형 번호)를 반환
(domain: AF_UNIX or AF_INET, type: SOCK_STREAM or SOCK_DGRAM, protocol: 0) - bind(int s, cosnt struct sockaddr *name, socklen_t *namelen) @서버에서 실행
: 생성된 소켓에 주소(IP, port)를 부여함. 서버에서 자신이 사용할 포트를 운영체제에 알림
(name: 바인딩할 소켓의 주소) - listen(int s, int backlog) @서버에서 실행
: s 소켓을 활성화하고 클라이언트 접속을 받을 상태가 됨.
(backlog는 대키큐의 크기로 소켓에서 대기할 수 있는 클라이언트의 연결 요청 개수를 설정한다.) - int sd = accept(int s, struct sockaddr *addr, socklen_t *addrlen) @서버에서 실행
: 클라이언트가 connect 함수를 호출해서 접속을 요청하면 해당 접속을 수락 (블로킹 함수)
접속이 수락되면 해당 클라이던트와 1:1 통신을 위한 전용의 소켓기술자(sd)가 리턴됨.
기존 소켓이 아니라, 해당 클라이언트와 1:1 통신을 하기 위한 '새로운 소켓'을 반환.
* 블로킹 함수: 특정 작업이 완료될 때까지 제어권을 반환하지 않고, 프로그램의 실행을 멈춘 채 기다리게 만드는 함수
클라이언트가 접속을 해야 함수가 끝나고 다음줄 실행됨. - connect(int s, const struct sockaddr *name, socklen_t namelen) @클라이언트에서 실행
: 클라이언트가 name이 가리키는 서버에 연결 시도 → 서버의 accept 함수에서 반응 - send(int sd, const void *msg, size_t len, int flags) @서버 및 클라이언트에서 실행
: 연결형 서비스(TCP)에서 데이터 전송 - recv(int sd, void *buf, size_t len, int flags) @서버 및 클라이언트에서 실행
: 연결형 서비스(TCP)에서 데이터 수신 (블로킹 함수) - UDP에서는 send()대신 sendto(), recv() 대신 recvfrom()을 사용
(2) 바이트 순서 변환
: 컴퓨터마다 데이터를 저장하는 순서(little endian vs big endian)가 다르다. 네트워크는 big endian을 표준으로 쓴다.
- htonl / htons: Host to Network (보낼 때).
- ntohl / ntohs: Network to Host (받을 때).

4. TCP 서버-클라이언트 프로그래밍 흐름 (암기)

5. UDP 서버-클라이언트 프로그래밍 흐름 (암기)

'컴퓨터공학 > 네트워크' 카테고리의 다른 글
| [네트워크] 14. 세션 계층, 표현 계층, 응용 계층 (L5, L6, L7) (0) | 2025.12.12 |
|---|---|
| [네트워크] 13. 소켓 프로그래밍 2 (비동기 통신 / 반복 서버 / 동시 동작 서버) (0) | 2025.12.11 |
| [네트워크] 11. 전송 계층 (L4: 3-way handshake, TCP, UDP, RTP) (0) | 2025.12.10 |
| [네트워크] 10. 네트워크 계층 2 (L3: 라우터, LPM, 버퍼링, IPv6, SDN) (0) | 2025.12.10 |
| [네트워크] 09. 네트워크 계층 1 (L3: 라우팅, 혼잡제어, 패킷 분할, IP 프로토콜, 다익스트라) (1) | 2025.12.09 |