Sockets 如何将WSAGetLastError与套接字错误代码关联

Sockets 如何将WSAGetLastError与套接字错误代码关联,sockets,winsock,Sockets,Winsock,我在这里看到Winsock错误代码列表 但是当我调用WSAGetLastError()时,结果是-2147014848(或0x80072740) 你如何将两者联系起来? 谢谢这是一个HRESULT风格的Microsoft错误代码。低16位是错误代码。设置高位,即严重性位。这表示失败,当然,如果解释为有符号32位整数,则会使值为负 高16位(减去高5位,即标志)是设施代码 请看这里: 这是设施7中的一个错误,其编号为0x2740或10048 这将是(感谢) ta daa:{WSA}EADDRIN

我在这里看到Winsock错误代码列表

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

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

这是一个
HRESULT
风格的Microsoft错误代码。低16位是错误代码。设置高位,即严重性位。这表示失败,当然,如果解释为有符号32位整数,则会使值为负

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

请看这里:

这是设施7中的一个错误,其编号为0x2740或10048

这将是(感谢)

ta daa:
{WSA}EADDRINUSE

好了。

根据

“[…]通过调用
WSAGetLastError
函数可以检索特定的错误号,[并且]Winsock错误代码可以转换为
HRESULT
,以便在远程过程调用(RPC)中使用
HRESULT\u FROM\u WIN32

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

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

/* A WSA function indicated an error above. */

Result = HRESULT_FROM_WIN32 (WSAGetLastError ());
这与使用普通函数
GetLastError()
时类似,该函数返回一个明确的Win32状态代码

通过使用此语句,您可以确保始终处理
HRESULT
。此外,即使有时
WSAGetLastError()
返回
HRESULT
,从\u WIN32调用宏函数
HRESULT\u只会返回相同的
HRESULT
未经修改的结果(请参阅\u WIN32
定义中的实际
HRESULT\u)

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

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