Windows

// 구식 lib는 Windsock인데, Windows.h에 자동 포함.
// 구식의 경우 기능도 부족하고 최적화도 덜 되었기에 WinSock2를 쓰는것을 추천.
#include "WinSock2.h"

// Socket = UINT_PTR (소켓의 상태와 데이터를 저장하는 메모리 영역)
SOCKET socket(...)

// Windows는 명시적으로 초기화와 해제를 해 주어야 한다.
// 이때 어느 버전의 라이브러리를 사용할지도 지정해야 한다.
// wVersionRequested: 2바이트 워드, 하위 바이트는 주 버전, 상위 바이트는 부 버전 번호
// lpWSAData: 활성화된 라이브러리에 대한 정보로 값을 채워준다. 선택된 구현 버전 등이 포함됨.
//            버전은 대개 요청한 그대로 선택되므로 굳이 체크가 필요하지 않다.
int WSAtartup(WORD wVersionRequested, LPWSADATA lpWSAData);

// 현재 진행 중이던 모든 소켓 동작이 강제 종료되고 소켓 리소스는 모두 소멸된다.
int WSACleanup();

// WSAtartup()은 Ref count가 되므로, 호출한 회수만큼 WSACleanup을 해주어야 한다.

POSIX

// 현재 열려있는 파일과 목록상 인덱스 (목록은 운영체제 내부에 숨겨져 있다)
// int로 구현하는 대신 포팅이 쉬워지나, 자료형 안정성이 부족하다. 
// (아무값이나 집어넣어도 컴파일러는 모름)
int socket(...)

// POSIX에서는 라이브러리가 항상 활성화 되어 있으므로 별도의 초기화 작업이 필요없다.

Error Code

Convention