더북(TheBook)

구현하려는 플랫폼이 소켓을 int형으로 지원하건 SOCKET형으로 지원하건 상관없이, 소켓 라이브러리를 쓰기 위해선 항상 이 값을 함수에 넘겨야 한다.

둘째 큰 차이점은 라이브러리를 쓰기 위해 사용하는 헤더 파일이 다르다는 것이다. 윈도용 소켓 라이브러리는 Winsock2라 하는데, 소켓을 사용하려는 코드에선 WinSock2.h#include해야 한다. 그냥 Winsock이라는 구식 라이브러리도 있는데, 대부분 윈도 프로그램이 기본으로 인클루드하는 Windows.h에 자동으로 포함된다. 구식 Winsock 라이브러리는 기능도 부족하고 최적화도 덜 되어있으므로 Winsock2를 사용하는 게 좋은데, 구식 헤더 파일에서 소켓 기본 함수의 이름을 선점해 버리므로 이름이 서로 충돌한다. Windows.hWinSock2.h를 같은 파일에서 인클루드하려 할 때 이 같은 충돌이 생긴다. 같은 이름의 함수를 여러 군데에서 선언하려 하므로 컴파일러가 에러를 마구 뱉어내는데, 위의 사실을 알지 못하면 문제가 무엇인지도 파악하기 어렵다. 이러한 혼란을 피하려면, Windows.h를 인클루드하기 전에 WinSock2.h를 먼저 #include하거나, Windows.h를 인클루드 하기에 앞서 WIN32_LEAN_AND_MEAN 매크로를 #define해야 한다. 이 매크로를 정의해 두면 전처리기가 Windows.h를 처리하는 와중에 Winsock 관련 내용 및 여러 문제 있는 다른 부분1을 포함하지 않게 할 수 있다.

 


 

1  역주 Windows에서 소켓뿐만 아니라 표준 C+ +로 뭔가 구현해 보려는데 자꾸 이상한 에러가 난다면, WIN32_LEAN_AND_MEAN을 정의해 두었는지 확인해 보자.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.