더북(TheBook)

플랫폼마다 에러를 통보하는 방식이 조금씩 다르다. 모든 플랫폼에서 대부분 함수는 에러 시 -1을 리턴한다. 윈도에서는 매직 넘버 -1 대신 SOCKET_ERROR를 사용하면 된다. -1만 가지고는 정확한 에러를 알 수 없으므로 Winsock2의 WSAGetLastError() 함수를 써서 에러의 원인을 알려주는 추가 에러 코드를 확인해야 한다.

int WSAGetLastError();

이 함수는 현재 실행 중인 스레드에서 마지막으로 발생한 에러 코드만 저장해 두므로, 소켓 라이브러리 함수의 결과로 -1을 받으면 즉시 확인해야 한다. 소켓 함수 하나가 실패한 상태에서 다른 소켓 함수를 연이어 호출하면 앞서 함수가 실패해버렸기 때문에 이후 호출도 실패할 수 있다. 하지만 이때 두 번째 호출로 인해 WSAGetLastError()의 리턴 값이 달라져 버려 원래 에러의 이유를 알 수 없게 된다.

POSIX 호환 라이브러리에도 비슷하게 상세 에러 정보를 조회하는 기능이 있다. 다만 POSIX 소켓 라이브러리는 별도의 함수를 따로 두지 않고 C 표준 라이브러리의 errno 전역 변수를 같이 사용한다. 이 에러 값을 확인하려면 errno.h를 인클루드해야 한다. 그러면 errno를 보통의 다른 전역 변수처럼 읽을 수 있다. WSAGetLastError()처럼 errno는 다른 소켓 또는 C 표준 함수를 호출할 때 덮어 쓰일 수 있으므로 에러를 감지한 시점에 즉시 확인해야 한다.

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