2장. 애플리케이션 계층: 소켓, 소켓 API

지난 기사에서는 계층 구조를 살펴보고 HTTP 요청, 응답 형식 및 DNS에 대해 살펴보았습니다. 이번 포스팅에서는 소켓과 이를 구현하기 위한 함수 구현에 대해 써보도록 하겠습니다.

1. 소켓이란?

소켓은 읽거나 보내려는 데이터를 저장하는 역할을 합니다.

소켓에는 두 가지 주요 유형이 있습니다.

  • 스트림 소켓
    • TCP는
    • 연결형, 양방향(동시 송수신) 순으로 안정적인 통신 보장
  • 데이터그램 소켓
    • UDP는
    • 신뢰할 수 없음, 주문 없음, 연결 없음, 언제든지 받거나 보낼 수 있음

2. 소켓 API

  1. 생성 및 설정: 누구와 어떤 포트를 사용할 것인가?
  2. 연결 시작
  3. 데이터 송수신
  4. 연결 끊김

TCP의 경우 소켓 함수는 여러 가지 방식으로 정의된다.



위의 프로세스를 시작하기 전에 클라이언트는 서버 주소와 열린 포트 번호를 알아야 합니다. 연결을 요청할 때 서버 주소와 포트 번호가 필요하기 때문입니다.

섬기는 사람의 관점에서 강을 보자.

Socket() – 이 함수는 소켓을 생성합니다. 파일 설명자(성공) 또는 -1(실패)을 반환합니다.

Bind() – 포트 할당 예) 인터넷 서핑의 경우 80이 기본값입니다. 0(성공) 또는 -1(실패)을 반환합니다.

Listen() – 클라이언트 요청 수신을 시작합니다. 0(성공) 또는 -1(실패)을 반환합니다. Listen은 논블로킹에 해당하며 즉시 반환됩니다.

Accept() – 이 함수는 요청을 수락합니다. 파일 설명자(성공) 또는 -1을 반환합니다. 차단과 유사하게 클라이언트 요청이 도착할 때까지 반환하지 않고 대기합니다.

Read() – 이 함수는 데이터를 읽습니다. 성공하면 0을, 실패하면 -1을 반환합니다. 읽기도 연결을 기다려야 하므로 차단됩니다.

Close() – 이 함수는 연결을 닫습니다. 성공하면 0을, 실패하면 -1을 반환합니다. 소켓이 닫히면 포트는 더 이상 사용되지 않습니다.

고객의 관점에서 보자.

Socket() – 이 함수는 소켓을 생성합니다.

Connect() – 이 함수는 연결을 요청합니다.

Write() – 이 함수는 데이터를 씁니다. 데이터가 전송될 때 반환되기 때문에 차단됩니다.

Read() – 이 함수는 데이터를 읽습니다(재생).

Close() – 이 함수는 연결을 닫습니다.