I'm porting some sockets code from Linux to Wi开发者_如何学JAVAndows.
In Linux, I could use strerror()
to convert an errno code into a human-readable string.
MSDN documentation shows equivalent strings for each error code returned from WSAGetLastError()
, but I don't see anything about how to retrieve those strings. Will strerror()
work here too?
How can I retrieve human-readable error strings from Winsock?
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);
As the documentation for WSAGetLastError
says you can use FormatMessage
to obtain a text version of the error message.
You need to set FORMAT_MESSAGE_FROM_SYSTEM
in the dwFlags
parameter and pass the error code as the dwMessage
parameter.
A slightly simpler version of mxcl's answer, which removes the need for malloc/free and the risks implicit therein, and which handles the case where no message text is available (since Microsoft doesn't document what happens then):
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
精彩评论