본문 바로가기
[ ★ ]Study/Network

윈도우 소켓 에러처리 (FormatMessage)

by nroses-taek 2017. 6. 11.

윈도우 환경에서는 FormatMessage 함수와 WSAGetLastError 함수를 이용하여 에러정보를 확인할 수 있다.

소켓 관련 함수를 사용하다가 발생한 에러 번호를 확인하기 위해서는 WSAGetLastError() 함수를 이용해야 한다.

#include <Winsock2.h>
int WSAGetLastError(void);

이 함수를 이용하여 에러 번호를 리턴하게 되는데, 그 번호를 이해하기는 어렵다. 이 정수형 값을 이해할 수 있는 문자열 형태로

변환해는 주는 함수가 바로 FormatMessage() 함수이다.

DWORD WINAPI Format Message(
    _In_    DWORD dwFlags,
    _In_opt    LPCVOID lpSource,
    _In_    DWORD    dwMessageID,
    _In_    DWORD    dwLanguageId,
    _Out_    LPTSTR    lpBuffer,
    _In_    DWORD nSize,
    _In_opt_    va_list *Arguments
);

 

dwFlags는 어떤 형태로 FormatMessage 함수를 호출할 것인지 저장하는 값으로 TCP 에코 서버 & 클라이언트 예제에 썼던 값으로는

FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM 값을 사용한다. 왼쪽은 오류 메시지를 저장할 수 있는 공간을 동적으로 할당한다는 의미이고, 오른쪽은 운영체제로부터 메시지를 가져온다는 의미이다. 메시지를 시스템으로 가져오며 메모리 공간을 동적으로 할당하기 때문에 lpSource 값은 NULL, nSize와 Arguments에는 0과 NULL값을 사용한다.

메모리를 동적으로 할당하도록 FormatMessage 함수를 사용하기 때문에 에러메시지를 처리한 후에는 동적으로 할당된 메모리 공간을 해제해 주어야 한다.

dwMessage는 에러 번호를 지정하며, WSAGetLastError 함수의 리턴값을 지정한다. dwLanguageId는 어떤 언어로 표시할 것인지 나타내는 값으로

MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT)를 지정하여 운영체제에서 설정된 기본 언어 값으로 에러 메시지를 가져오게 한다.

lpBuffer값은 오류 메시지의 시작주소를 지정하는 값이다. FormatMessage 함수를 호출할 때 에러 메시지를 저장하는 공간으로 동적으로 할당하기 때문에 주소값을 저장할 변수의 주소값을 지정하면 된다.

동적으로 할당된 메모리 공간은 프로그램이 종료되기 전까지는 해제되지 않기 때문에 에러 메시지를 처리한 다음에 동적으로 할당된 공간을 해제해 주어야한다. 이 때 사용되는 함수가 LocalFree() 함수이다.

 

TCP 에코 서버 <-- FormatMessage 사용 게시글 클릭

'[ ★ ]Study > Network' 카테고리의 다른 글

UDP 서버 예제 프로그램  (0) 2017.06.12
UDP 프로토콜  (0) 2017.06.12
TCP 에코 클라이언트 (윈도우)  (0) 2017.06.11
TCP 에코 서버 (윈도우)  (0) 2017.06.11
TCP 에코 서버 클라이언트 (리눅스)  (0) 2017.06.11

댓글