pelicula errores definicion cadena c winapi sockets winsock

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