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); // ③ 연결 종료
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);
'Deep Dive > CS' 카테고리의 다른 글
[CS] CGI / WebServer / MIME Type (1) | 2025.05.06 |
---|---|
[CS] Datagram Socket vs Stream Socket (1) | 2025.05.06 |
[CS] 클라이언트-서버 모델 (Client-Server Model) (0) | 2025.05.06 |
[CS] 파일 디스크립터 (file descriptor) (0) | 2025.05.06 |
[CS] 프록시(Proxy) (0) | 2025.05.06 |