3.8 요약
버클리 소켓은 인터넷으로 데이터를 주고받는데 가장 널리 쓰이는 라이브러리이다. 플랫폼마다 라이브러리의 인터페이스가 조금씩 다르긴 하지만 핵심 요소는 같다.
라이브러리의 핵심 자료형은 sockaddr로, 이것으로 여러 네트워크 계층 프로토콜의 주소를 나타낼 수 있다. 발신자나 수신자의 주소를 지정할 필요가 있을 때 이것을 사용하면 된다.
UDP 소켓은 연결이 유지되지 않고 내부 상태도 없다. SOCK_DGRAM으로 socket() 함수를 호출해 UDP 소켓을 만들고 여기에 sendto()로 데이터그램을 보내면 된다. UDP 소켓에서 UDP 패킷을 받으려면 먼저 운영체제가 포트 하나를 배정해 주도록 bind() 함수를 호출한 다음, recvfrom()을 호출해 들어오는 데이터를 받으면 된다.
TCP 소켓은 내부 상태가 있으며, 데이터를 전송하기 전에 먼저 연결을 맺어야 한다. 연결을 맺으려면 connect() 함수를 호출한다. 연결을 받기 위해 리스닝하려면 listen() 함수를 호출한다. 리스닝 중인 소켓에 연결이 들어오면 accept() 함수를 호출해 새 소켓을 만들어 이쪽의 종단점으로 삼는다. 연결된 소켓에 데이터를 보내려면 send() 함수를, 읽으려면 recv() 함수를 호출한다.