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