Как получить строку ошибки из WSAGetLastError ()? - PullRequest
24 голосов
/ 04 августа 2010

Я портирую код сокетов из Linux в Windows.

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

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

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

Ответы [ 3 ]

33 голосов
/ 24 мая 2013
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);
14 голосов
/ 04 августа 2010

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

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

4 голосов
/ 07 сентября 2017

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