Подтвердить что ты не робот

Как получить строку ошибок из WSAGetLastError()?

Я переношу некоторый код сокетов из Linux в Windows.

В Linux я мог бы использовать strerror() для преобразования кода errno в удобочитаемую строку.

Документация MSDN показывает эквивалентные строки для каждого кода ошибки, возвращаемого из WSAGetLastError(), но я ничего не вижу о том, как получить эти строки. Будет ли здесь работать strerror()?

Как я могу получить строки, считываемые человеком, из Winsock?

4b9b3361

Ответ 1

В документации WSAGetLastError говорится, что вы можете использовать FormatMessage, чтобы получить текстовую версию сообщения об ошибке.

Вам нужно установить FORMAT_MESSAGE_FROM_SYSTEM в параметр dwFlags и передать код ошибки в качестве параметра dwMessage.

Ответ 2

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);

Ответ 3

Несколько более простая версия ответа 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