[CS] 소켓(socket, bind, listen, accept, connect, close)

socket, bind, listen, accept, connect, close는 C 언어나 시스템 프로그래밍에서 TCP/IP 네트워크 통신을 구현하기 위해 사용하는 시스템 콜이다.
이 함수들을 이용하면 클라이언트-서버 통신 모델을 직접 구현할 수 있다.


1. 전체 흐름 요약

서버 측 순서

int sockfd = socket(...);     // ① 소켓 생성
bind(sockfd, ...);            // ② IP/포트 지정
listen(sockfd, ...);          // ③ 연결 대기 상태 진입
int connfd = accept(sockfd);  // ④ 클라이언트 연결 수락
// read()/write()로 데이터 송수신
close(connfd);                // ⑤ 연결 종료
close(sockfd);                // (옵션) 전체 소켓 종료

클라이언트 측 순서

int sockfd = socket(...);     // ① 소켓 생성
connect(sockfd, ...);         // ② 서버에 연결 요청
// read()/write()로 데이터 송수신
close(sockfd);                // ③ 연결 종료

이미지 출처: CSAPP 11장


2. 함수별 설명

1. socket()

  • 역할: 소켓(통신의 끝점)을 생성한다.
  • 형식:
int socket(int domain, int type, int protocol);
  • 예시:
socket(AF_INET, SOCK_STREAM, 0); // IPv4, TCP
  • 반환: 소켓 디스크립터 (int), 실패 시 -1

2. bind()

  • 역할: 서버 측에서 소켓에 IP 주소와 포트 번호를 할당한다.
  • 형식:
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
  • 예시:
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(8080);
addr.sin_addr.s_addr = INADDR_ANY;

bind(sockfd, (struct sockaddr*)&addr, sizeof(addr));

3. listen()

  • 역할: 서버를 연결 대기 상태로 전환한다.
  • 형식:
int listen(int sockfd, int backlog);
  • backlog: 대기열의 최대 연결 수

4. accept()

  • 역할: 클라이언트의 연결 요청을 수락하고, 새로운 소켓을 반환한다.
  • 형식:
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
  • 특징: listen()에 등록된 소켓으로부터 실제 데이터 송수신은 accept()가 반환한 소켓으로 수행함.

5. connect()

  • 역할: 클라이언트 측에서 서버로 연결을 요청한다.
  • 형식:
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

6. close()

  • 역할: 소켓을 닫아 리소스를 반환한다.
  • 형식:
int close(int sockfd);