Я переношу некоторый код сокетов из 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