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

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

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

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

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

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

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

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

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