DWORD WINAPI TCPServer4(LPVOID arg)
{
int retval;
// 소켓 생성
SOCKET listen_sock = socket(AF_INET, SOCK_STREAM, 0);
if (listen_sock == INVALID_SOCKET) err_quit("socket()");
...
...
...
}
void err_quit(const char* msg)
{
LPVOID lpMsgBuf;
FormatMessageA(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL, WSAGetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(char*)&lpMsgBuf, 0, NULL);
MessageBoxA(NULL, (const char*)lpMsgBuf, msg, MB_ICONERROR);
LocalFree(lpMsgBuf);
exit(1);
}
void err_quit(const char* msg)
{
위 코드는 윈도우에서 윈도우 소켓 프로그래밍 시 발생할 수 있는
오류를 처리하기 위해 사용하는 err_quit이라는 C++ 함수입니다.
단일 인수인 msg라는 이름의 const char* 변수를 사용합니다.
이는 프로그래머가 오류 발생 시 표시하려는 오류 메시지입니다.
LPVOID lpMsgBuf;
if (listen_sock == INVALID_SOCKET)의 조건에 맞아 err_quit 함수가 호출되면
메시지를 저장하는 데 사용할 수 있는 메모리 블록에 대한 포인터인
'LPVOID' 유형의 변수 'lpMsgBuf'를 선언합니다
FormatMessageA(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL, WSAGetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(char*)&lpMsgBuf, 0, NULL);
이후 FormatMessageA 함수를 사용하여
실패한 마지막 Winsock 함수 호출에 대한 오류 코드를 검색하는
WSAGetLastError() 함수에 의해 반환된 오류 코드를 기반으로 메시지 문자열의 형식을 지정합니다.
'FormatMessageA' 함수는 메시지 형식을 지정하는 플래그, 메시지 언어 및
메시지가 저장되어야 하는 버퍼에 대한 포인터를 포함하여 여러 인수를 사용합니다. 'FORMAT_MESSAGE_ALLOCATE_BUFFER' 플래그는
메시지 버퍼에 메모리를 할당하도록 함수에 지시하고
'FORMAT_MESSAGE_FROM_SYSTEM' 플래그는
메시지가 시스템 메시지 테이블에서 검색되어야 함을 지정합니다.
FormatMessageA(
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
'MAKELANGID' 기능은 메시지의 언어를 지정하는 데 사용되며,
이 경우 중립 언어 및 기본 하위 언어로 설정됩니다.
MessageBoxA(NULL, (const char*)lpMsgBuf, msg, MB_ICONERROR);
메시지 상자에 오류 메시지를 표시하기 위해 'MessageBoxA' 함수가 호출됩니다.
메시지 상자에는 FormatMessageA에 의해 반환된 메시지,
msg 인수로 전달된 오류 메시지 및 오류 아이콘이 포함됩니다.
MB_ICONERROR 플래그는 오류 아이콘이 메시지 상자에 표시되도록 지정합니다.
LocalFree(lpMsgBuf);
exit(1);
마지막으로 FormatMessageA 함수에 의해 메시지 버퍼에 할당된
메모리를 해제하기 위해 LocalFree 함수가 호출됩니다.
그런 다음 함수는 오류 코드 1과 함께 종료됩니다.
요약하면 'err_quit' 함수는 Winsock 함수 호출이 실패할 때
메시지 상자에 오류 메시지를 표시하는 데 사용됩니다.
메시지에는 시스템 오류 메시지와 함수에 대한 인수로 전달된
사용자 정의 오류 메시지가 포함됩니다.
'네트워크 > Socket Progamming' 카테고리의 다른 글
C# Chating (0) | 2024.03.07 |
---|---|
C# 비동기 통신 (0) | 2024.03.03 |
Socket Programming의 기본 개념 (0) | 2024.02.28 |
비동기 연결 예제 (0) | 2024.02.28 |
Socket Programming (0) | 2023.05.07 |