[네트워크] 12. 소켓 프로그래밍 1 (소켓 주소 / 핵심 함수 / TCP, UDP 서버 클라이언트 흐름)

2025. 12. 11. 21:42·컴퓨터공학/네트워크

1. 소켓 프로그래밍 개요

[소켓의 개념]

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

 

[소켓의 종류와 통신 방식]

소켓 통신의 4가지 조합

  • 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
'컴퓨터공학/네트워크' 카테고리의 다른 글
  • [네트워크] 14. 세션 계층, 표현 계층, 응용 계층 (L5, L6, L7)
  • [네트워크] 13. 소켓 프로그래밍 2 (비동기 통신 / 반복 서버 / 동시 동작 서버)
  • [네트워크] 11. 전송 계층 (L4: 3-way handshake, TCP, UDP, RTP)
  • [네트워크] 10. 네트워크 계층 2 (L3: 라우터, LPM, 버퍼링, IPv6, SDN)
sophon
sophon
sophon 님의 블로그 입니다.
  • sophon
    sophon 님의 블로그
    sophon
    • 카테고리 (172) N
      • 컴퓨터공학 (36)
        • 데이터베이스 (19)
        • 네트워크 (15)
        • 기타 이슈 (2)
      • 프로젝트 (16) N
        • Java (8)
        • Spring (4) N
        • Docker (4)
      • 코딩테스트 (95) N
        • BOJ (74)
        • 프로그래머스 (7)
        • 프로그래머스 SQL (12) N
        • PS Snippets (2)
      • 🌱 잡담 (22)
        • 자격증 (7)
        • 좋은 시 모음 (12)
        • 책과 영화 (3)
        • 기록 (0)
  • 전체
    오늘
    어제
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
sophon
[네트워크] 12. 소켓 프로그래밍 1 (소켓 주소 / 핵심 함수 / TCP, UDP 서버 클라이언트 흐름)
상단으로

티스토리툴바