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
- 모든 플랫폼에서 대부분 함수는 에러 시 -1을 리턴한다.
- Windows에서는 SOCKET_ERROR(-1)를 사용한다.
- 좀 더 자세한 원인은
WSAGetLastError() 함수를 써서 확인 해야 한다.
- POSIX에서도
errno() 함수를 사용해서 좀 더 자세한 원인을 확인할 수 있다.
Convention
- 대부분 플랫폼 독립적인 함수 이름은 소문자로만 되어있다.
- Windows 전용 함수는 대문자로 시작하고, 어떤 경우엔 WSA를 접두사로 붙인다.