pelicula - cadena de errores definicion
¿Cómo recupero una cadena de error de WSAGetLastError()? (3)
Estoy portando código de algunos sockets de Linux a Windows.
En Linux, podría usar strerror()
para convertir un código errno en una cadena legible por humanos.
La documentación de MSDN muestra cadenas equivalentes para cada código de error devuelto por WSAGetLastError()
, pero no veo nada sobre cómo recuperar esas cadenas. ¿Will strerror()
trabaja aquí también?
¿Cómo puedo recuperar cadenas de error legibles por humanos de Winsock?
Como la documentación de WSAGetLastError
dice que puede usar FormatMessage
para obtener una versión de texto del mensaje de error.
FORMAT_MESSAGE_FROM_SYSTEM
establecer FORMAT_MESSAGE_FROM_SYSTEM
en el parámetro dwFlags
y pasar el código de error como el parámetro dwMessage
.
Una versión ligeramente más simple de la respuesta de mxcl, que elimina la necesidad de malloc / free y los riesgos implícitos en ella, y que maneja el caso donde no hay texto de mensaje disponible (ya que Microsoft no documenta lo que sucede en ese momento):
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
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);