Как получить строку ошибок из WSAGetLastError()?
Я переношу некоторый код сокетов из Linux в Windows.
В Linux я мог бы использовать strerror()
для преобразования кода errno в удобочитаемую строку.
Документация MSDN показывает эквивалентные строки для каждого кода ошибки, возвращаемого из WSAGetLastError()
, но я ничего не вижу о том, как получить эти строки. Будет ли здесь работать strerror()
?
Как я могу получить строки, считываемые человеком, из Winsock?
Ответы
Ответ 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