【问题标题】:How to correlate WSAGetLastError with Socket error code如何将 WSAGetLastError 与 Socket 错误代码相关联
【发布时间】:2012-03-08 16:46:21
【问题描述】:

我在这里看到了 Winsock 错误代码列表 http://msdn.microsoft.com/en-us/library/windows/desktop/ms740668(v=vs.85).aspx

但是当我调用 WSAGetLastError() 时,结果是 -2147014848(或 0x80072740)

您如何将两者关联起来? 谢谢

【问题讨论】:

    标签: sockets winsock


    【解决方案1】:

    这是HRESULT 样式的 Microsoft 错误代码。低 16 位是错误代码。设置高位,即严重性位。这表示失败,当然,如果将其解释为带符号的 32 位整数,则该值会变为负数。

    高 16 位(减去高 5 位,即标志)是设施代码。

    请看这里:http://en.wikipedia.org/wiki/HRESULT

    所以这是一个错误,在设施 7 中,其编号为 0x2740 或 10048。

    那就是(感谢http://msdn.microsoft.com/en-us/library/windows/desktop/ms740668%28v=vs.85%29.aspx

    ta daa:{WSA}EADDRINUSE

    你去。

    【讨论】:

      【解决方案2】:

      根据Microsoft's documentation for Windows Socket 2

      "[...] 可以通过调用 WSAGetLastError 函数来检索特定的错误号 [并且] Winsock 错误代码可以转换为 HRESULT 以用于远程过程调用(RPC ) 使用HRESULT_FROM_WIN32。"

      我同意@Kaz 的回答,即您收到的0x80072740 的错误代码似乎是HRESULT,但是,这里感觉有些不对劲,唯一的事实是您甚至得到了HRESULT。在调用WSAGetLastError() 时,根据我的理解,您基本上应该在所有情况下都返回一个 Win32 状态代码。我没有看到任何已发布的代码,因此我不能完全确定您没有先将代码转换为 HRESULT。

      但是,在检索 Windows Socket API (WSA) 错误代码时使用以下语句是最安全的:

      /* A WSA function indicated an error above. */
      
      Result = HRESULT_FROM_WIN32 (WSAGetLastError ());
      

      这与使用普通函数 GetLastError() 时类似,它返回一个明确的 Win32 状态代码。

      通过使用此语句,您可以保证您始终与HRESULT 打交道。此外,即使 WSAGetLastError() 有时会返回 HRESULT,调用宏函数 HRESULT_FROM_WIN32 只会返回相同的 HRESULT 未修改(参见实际的 HRESULT_FROM_WIN32 定义 here)。

      最后,当试图找出特定的 Microsoft Windows 特定错误代码时,我建议使用以下错误代码查找站点:https://errorcodelookup.com/。您提供的错误码指的是错误码WSAEADDRINUSE(0x80072740):

      “每个套接字地址(协议/网络地址/端口)通常只允许使用一次。”

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-04
        • 2011-03-20
        • 2011-03-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多