오류 처리

Server/Winodw Network 2015. 7. 14. 15:10

네트워크 프로그램에서는 여러 원인으로 인해서 오류가 발생할 수 있다.

발생 확률 또한 비교적 높은 편이다.

 

윈도우 소켓 함수는 오류 처리 방법에 따라서 다음과 같이 세 가지의 유형을 나눠진다.

 

---------------------------------------------------------------------------

1. 오류 처리를 할 필요가 없는 경우

- 리턴값이 없거나 호출 시에 항상 성공하는 일부 소켓 함수

 

2. 리턴값만으로 오류를 처리하는 함수

- WSAStartUp() 함수

 

3. 리턴값으로 오류 발생을 확인하고, 구체적인 내용은 오류 코드를 이용하여 확인하는 경우

- 대부분의 소켓 함수

---------------------------------------------------------------------------

 

1,2번은 특별한 경우에 해당하고 3번의 경우에는 대부분의 소켓함수가 적용된다.

 

소켓 함수 결과가 오류가 발생했다면 WSAGetLastError() 함수를 이용해서 오류 코드를 얻을 수 있다.

 

WSAGetLastError() 함수의 리턴값을 그대로 화면에 표시할 경우에는 사용자가 직접 오류 코드를 조사해야 하는 불편이 따른다.

그래서 해당 오류 코드를 적절한 문자열 형태로 출력하는 것이 바람직하다.

 

FormatMessage() 함수를 사용하면 오류 코드를 오류 메세지로 자동으로 바꿀 수 있다.

 

DWORD  FormatMessage(

DWORD        dwFlags,

LPCVOID      lpSource,

DWORD        dwMessageId,

DWORD        dwLanguageId,

LPTSTR        lpBuffer,

DWORD        nSize,

va_list*        Arguments

);    

 

 

1. DWORD        dwFlags

 

FORMAT_MESSAGE_ALLOCATE_BUFER_MESSAGE

- 오류 메시지를 저장할 공간을 FormatMessage() 함수가 알아서 할당한다는 의미이다.

 

FORMAT_MESSAGE_FROM_SYSTEM

- 운영체제로부터 오류 메시지를 가져온다는 의미

 

dwFlags를 설정할 경우, 두 번째 인자인 lpSource에는 NULL,

nSize와 Arguments에는 0, NULL 값을 사용하면 된다.

 

2. DWORD    dwMessageId

- 오류 코드를 나타내며, WSAGetLsatError() 함수의 리턴값을 사용한다.

 

3. DWORD    dwLanguageId

- 오류 메시지를 어떤 언어로 표시할 것인지를 나타낸다.

 

4. LPTSTR lpBuffer

- 오류 메시지의 시작 주소가 여기에 저장된다.

오류 메시지를 저장할 공간은 FormatMessage()가 알아서 할당하므로 사용자는

주소값을 저장할 변수 주소만 여기에 넣어주면 된다.

오류 메시지 사용이 끝나면 LocalFree()함수를 사용해서  시스템이 할당한 메모리를 반환해야 한다.

 

 

 

 

 

'Server > Winodw Network' 카테고리의 다른 글

소켓 생성과 닫기  (0) 2015.07.14
윈도우 소켓 초기화와 종료  (0) 2015.07.14
윈도우 소켓  (0) 2015.07.13
소켓 개념  (0) 2015.07.13
패킷 전송 원리  (0) 2015.07.11
admin