如何将WSAGetLastError与Socket错误代码相关联

时间:2012-03-08 16:46:22

标签: sockets winsock

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

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

你如何将两者联系起来? 感谢

2 个答案:

答案 0 :(得分:0)

这是一个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

你去。

答案 1 :(得分:0)

根据Microsoft's documentation for Windows Socket 2

<块引用>

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

我同意 @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 定义 {{ 3}}).

最后,在尝试找出特定的 Microsoft Windows 特定错误代码时,我建议使用以下错误代码查找站点:here。您提供的错误代码是指错误代码 WSAEADDRINUSE (0x80072740):

<块引用>

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