codememo

WSAGetLastError()에서 오류 문자열을 검색하려면 어떻게 합니까?

tipmemo 2023. 10. 15. 17:23
반응형

WSAGetLastError()에서 오류 문자열을 검색하려면 어떻게 합니까?

리눅스에서 윈도우로 소켓 코드를 이식하고 있습니다.

리눅스에서 나는 사용할 수 있었습니다.strerror()오류 코드를 인간 readable 문자열로 변환합니다.

MSDN 문서에는 반환되는 각 오류 코드에 대해 동일한 문자열이 표시됩니다.WSAGetLastError(), 하지만 그 끈을 어떻게 회수할 수 있는지에 대해서는 아무것도 보이지 않습니다.할 것이다strerror()여기서도 일해요?

Winsock에서 사람이 읽을 수 있는 오류 문자열을 검색하려면 어떻게 해야 합니까?

wchar_t *s = NULL;
FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, 
               NULL, WSAGetLastError(),
               MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
               (LPWSTR)&s, 0, NULL);
fprintf(stderr, "%S\n", s);
LocalFree(s);

의 설명서에 나와 있듯이 오류 메시지의 텍스트 버전을 가져올 때 사용할 수 있습니다.

설정해야 합니다.FORMAT_MESSAGE_FROM_SYSTEM에서dwFlagsparameter and pass the error code를dwMessage매개 변수.

mxcl의 답변은 malloc/free의 필요성과 그 안에 내포된 위험성을 제거하고 메시지 텍스트를 사용할 수 없는 경우를 처리하는 약간 단순한 버전입니다(Microsoft는 그 때 어떤 일이 일어나는지 문서화하지 않기 때문에).

int
   err;

char
   msgbuf [256];   // for a message up to 255 bytes.


msgbuf [0] = '\0';    // Microsoft doesn't guarantee this on man page.

err = WSAGetLastError ();

FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,   // flags
               NULL,                // lpsource
               err,                 // message id
               MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT),    // languageid
               msgbuf,              // output buffer
               sizeof (msgbuf),     // size of msgbuf, bytes
               NULL);               // va_list of arguments

if (! *msgbuf)
   sprintf (msgbuf, "%d", err);  // provide error # if no string available

언급URL : https://stackoverflow.com/questions/3400922/how-do-i-retrieve-an-error-string-from-wsagetlasterror

반응형