【问题标题】:How to get getaddrinfo() error code? [closed]如何获取 getaddrinfo() 错误代码? [关闭]
【发布时间】:2017-08-08 07:02:25
【问题描述】:

来自Winsock Reference page,它说:

getaddrinfo 函数

返回值

成功返回零。失败返回非零 Windows 套接字错误代码,如在 Windows 套接字错误代码中找到的

使用 gai_strerror 函数根据 getaddrinfo 函数返回的 EAI 代码打印错误消息。提供 gai_strerror 函数是为了符合 IETF 建议,但它不是线程安全的。 因此,建议使用 WSAGetLastError 等传统的 Windows Sockets 函数。

它说可以在Windows Sockets Error Codes page 中找到 EAI 错误代码,但我在该页面中看不到任何 EAI 代码,例如 EAI_AGAIN、EAI_BADFLAGS 等...

对于Windows,获取代码的正确方法是检查getaddrinfo是否返回非零值,然后调用WSAGetLastError获取代码?

【问题讨论】:

  • 你使用 WSAGetLastError 并且这里是如何检索相应的字符串:stackoverflow.com/questions/3400922/…
  • '它说 EAI 错误代码可以在 Windows 套接字错误代码页面中找到'。不,它没有。它在该 MSDN 页面上提供了一个映射。

标签: c++ sockets winapi winsock


【解决方案1】:

是的,标准方法是使用getaddrinfo,如果它返回非零,则调用WSAGetLastError 来检索Winsock 错误代码。

然后您可以使用FormatMessage 将错误代码转换为人类可读的字符串,方法是将FORMAT_MESSAGE_FROM_SYSTEM 作为dwFlags 参数传递,并将错误代码作为dwMessage 参数传递。您可以在FORMAT_MESSAGE_FROM_SYSTEM 下的表格中查看此行为here 的文档。 Asesh 指出了this link,其中有一些示例代码证明了这一点。

您可以像在 Linux 系统上一样使用gai_strerror,但according to MSDN(搜索gai_strerror)不是线程安全的,因此首选FormatMessage

或者,您也可以使用 this nice big list 手动交叉引用它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-20
    • 2013-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-30
    • 2013-10-17
    相关资源
    最近更新 更多