소켓 프로그래밍
IT 위키
Socket Programming
소켓(Socket)이라는 통신 종단점을 만들어 프로세스끼리 네트워크로 데이터를 주고받는 프로그래밍 방식
1983년 BSD 유닉스가 내놓은 버클리 소켓(Berkeley Socket) 규격이 사실상 표준이 되었고, 윈도우의 Winsock도 이를 따른다. 소켓 하나는 IP 주소 + 포트 번호 + 프로토콜 로 식별된다.
| 순서 | 함수 | 하는 일 |
|---|---|---|
| 1 | socket() | 소켓을 생성하고 파일 디스크립터를 돌려받는다 |
| 2 | bind() | 생성한 소켓에 IP 주소와 포트 번호를 붙인다 |
| 3 | listen() | 소켓을 수동 대기 상태로 바꿔 클라이언트의 접속 요청을 기다린다 |
| 4 | accept() | 대기 큐에 들어온 접속 요청을 꺼내 연결된 새 소켓을 만든다 |
| 5 | read() / write() | 데이터를 주고받는다 |
| 6 | close() | 연결을 끊는다 |
`listen()` 과 `accept()` 는 자주 혼동된다. 대기 상태로 만들어 요청을 기다리게 하는 것이 `listen()` 이고, 기다리다가 실제로 하나를 꺼내 연결을 완성하는 것이 `accept()` 다.
socket() → connect() → read()/write() → close()
클라이언트는 `bind()` 를 생략하는 것이 보통이다. 이 경우 운영체제가 사용하지 않는 포트를 자동으로 할당한다.
- 스트림 소켓(SOCK_STREAM) : TCP를 쓴다. 연결 지향이고 순서와 신뢰성을 보장한다.
- 데이터그램 소켓(SOCK_DGRAM) : UDP를 쓴다. 비연결형이고 순서·도착을 보장하지 않는다.
- 로우 소켓(SOCK_RAW) : IP 헤더까지 직접 다룬다. 패킷 분석 도구나 ping 구현에 쓴다.
`listen()` 을 호출한 서버 소켓은 LISTEN 상태가 되고, 3-way 핸드셰이크가 끝나면 ESTABLISHED 상태의 소켓이 `accept()` 로 반환된다. 연결을 끊는 쪽은 TIME_WAIT 상태를 거친다. `netstat` 으로 확인할 수 있다.
