지난 기사에서는 계층 구조를 살펴보고 HTTP 요청, 응답 형식 및 DNS에 대해 살펴보았습니다. 이번 포스팅에서는 소켓과 이를 구현하기 위한 함수 구현에 대해 써보도록 하겠습니다.
1. 소켓이란?
소켓은 읽거나 보내려는 데이터를 저장하는 역할을 합니다.
소켓에는 두 가지 주요 유형이 있습니다.
- 스트림 소켓
- TCP는
- 연결형, 양방향(동시 송수신) 순으로 안정적인 통신 보장
- 데이터그램 소켓
- UDP는
- 신뢰할 수 없음, 주문 없음, 연결 없음, 언제든지 받거나 보낼 수 있음
2. 소켓 API
- 생성 및 설정: 누구와 어떤 포트를 사용할 것인가?
- 연결 시작
- 데이터 송수신
- 연결 끊김
TCP의 경우 소켓 함수는 여러 가지 방식으로 정의된다.

위의 프로세스를 시작하기 전에 클라이언트는 서버 주소와 열린 포트 번호를 알아야 합니다. 연결을 요청할 때 서버 주소와 포트 번호가 필요하기 때문입니다.
섬기는 사람의 관점에서 강을 보자.
Socket() – 이 함수는 소켓을 생성합니다. 파일 설명자(성공) 또는 -1(실패)을 반환합니다.
Bind() – 포트 할당 예) 인터넷 서핑의 경우 80이 기본값입니다. 0(성공) 또는 -1(실패)을 반환합니다.
Listen() – 클라이언트 요청 수신을 시작합니다. 0(성공) 또는 -1(실패)을 반환합니다. Listen은 논블로킹에 해당하며 즉시 반환됩니다.
Accept() – 이 함수는 요청을 수락합니다. 파일 설명자(성공) 또는 -1을 반환합니다. 차단과 유사하게 클라이언트 요청이 도착할 때까지 반환하지 않고 대기합니다.
Read() – 이 함수는 데이터를 읽습니다. 성공하면 0을, 실패하면 -1을 반환합니다. 읽기도 연결을 기다려야 하므로 차단됩니다.
Close() – 이 함수는 연결을 닫습니다. 성공하면 0을, 실패하면 -1을 반환합니다. 소켓이 닫히면 포트는 더 이상 사용되지 않습니다.
고객의 관점에서 보자.
Socket() – 이 함수는 소켓을 생성합니다.
Connect() – 이 함수는 연결을 요청합니다.
Write() – 이 함수는 데이터를 씁니다. 데이터가 전송될 때 반환되기 때문에 차단됩니다.
Read() – 이 함수는 데이터를 읽습니다(재생).
Close() – 이 함수는 연결을 닫습니다.