【发布时间】:2012-03-08 16:46:21
【问题描述】:
我在这里看到了 Winsock 错误代码列表 http://msdn.microsoft.com/en-us/library/windows/desktop/ms740668(v=vs.85).aspx
但是当我调用 WSAGetLastError() 时,结果是 -2147014848(或 0x80072740)
您如何将两者关联起来? 谢谢
【问题讨论】:
我在这里看到了 Winsock 错误代码列表 http://msdn.microsoft.com/en-us/library/windows/desktop/ms740668(v=vs.85).aspx
但是当我调用 WSAGetLastError() 时,结果是 -2147014848(或 0x80072740)
您如何将两者关联起来? 谢谢
【问题讨论】:
这是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
你去。
【讨论】:
根据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):
“每个套接字地址(协议/网络地址/端口)通常只允许使用一次。”
【讨论】: