출처 : https://velog.io/@seanlion/webserverimplementation
소켓 프로그래밍

connect( ) API: 연결 요청에 대한 결과(성공, 거절, 시간초과) 가 뜨기 전까지는 실행 안끝남
send( ) , recv( ) AP I: 역시 connect와 마친가지 다만 recv( )는 통신 대상이 언제, 어떤 데이터를 보낼건지 모르기 때문에 API가 한번 실행되면 언제 끝날지 모름 그래서 recv( )는 별도의 스레드에서 실행
bind(socket, port number) API : 앞에서 같은 포트 번호를 가지는 많은 소켓들이 존재 가능하다 했다. 만약 10000이라는 포트번호로 데이터가 수신될 때 어떤 소켓이 처리해야 되는지 모른다. bind 함수는 내부적으로 포트 번호와 소켓 연결 정보를 관리해줌. 운영체제가 특정 포트 번호를 서버 소켓이 사용하도록 만들기 위해 소켓과 포트 번호를 결합(bind)해야 되는데, 이게 바로 'socket binding' 이다.
listen( ) API: connect에 의해 연결 요청이 수신되는지 기다리다가, 수신되면 대기 상태를 종료하고 return SUCCESS, 에러가 발생하면 (소켓 close 포함) return FAIL대기 중인 연결 요청은 Queue 에 저장됨
accept( ) API: 최종적으로 클라이언트 소켓과 연결이 만들어지는 소켓은 앞서 사용한 서버 소켓이 아니라, accept API 내부에서 새로 만들어지는 소켓
데이터 송수신을 위한 새로운 소켓을 만들고 서버 소켓의 대기 큐에 쌓여있는 첫 번째 연결 요청을 매핑시킴
교환 방식

TCP Flow

UDP Flow

int getaddrinfo(
const char *host,
const char *service,
const struct addrinfo *hints,
struct addrinfo **result
);
void freeaddrinfo(struct addrinfo *result);