Winapi 是否需要清除WSAGetLastError(),如果需要,如何清除?

Winapi 是否需要清除WSAGetLastError(),如果需要,如何清除?,winapi,networking,Winapi,Networking,在Unix中,某些函数调用不能保证清除errno,因此,除非在调用之前自己清除,否则无法通过检查errno来检测错误。例如: errno = 0; some_function(); if ( errno ) { : : 在Windows上,使用WSAGetLastError()代替errno。所有WSA函数是否在成功后清除最后一个错误?如果没有,有没有办法手动清除?如果不是这样,你怎么办?不,你不需要清除它。只有在函数失败时才调用WSAGetLastError 正常模式

在Unix中,某些函数调用不能保证清除
errno
,因此,除非在调用之前自己清除,否则无法通过检查
errno
来检测错误。例如:

errno = 0;
some_function();
if ( errno ) {
      :
      :

在Windows上,使用WSAGetLastError()代替errno。所有WSA函数是否在成功后清除最后一个错误?如果没有,有没有办法手动清除?如果不是这样,你怎么办?

不,你不需要清除它。只有在函数失败时才调用WSAGetLastError

正常模式只是:

if (0 != WSAEventSelect(...))
{
  int error = WSAGetLastError();
  handle_error(error);
}
else
{
  WaitForSingleObject(...);
  ...
}
有一个函数可以调用,但通常没有理由调用

Windows上的大多数函数都是在发生故障时才设置错误代码的

int WSAWhatever()
{
  BOOL success = something() && somethingelse();
  if (!success)
  {
    WSASetLastError(WSASOMETHING);
    return SOCKET_ERROR;
  }
  return 0;
}

Win32中有几个地方需要使用
SetLastError
GetFileSize
等)清除错误,但如果需要,它会在MSDN的文档中调用。

不,您不需要清除它。只有在函数失败时才调用WSAGetLastError

正常模式只是:

if (0 != WSAEventSelect(...))
{
  int error = WSAGetLastError();
  handle_error(error);
}
else
{
  WaitForSingleObject(...);
  ...
}
有一个函数可以调用,但通常没有理由调用

Windows上的大多数函数都是在发生故障时才设置错误代码的

int WSAWhatever()
{
  BOOL success = something() && somethingelse();
  if (!success)
  {
    WSASetLastError(WSASOMETHING);
    return SOCKET_ERROR;
  }
  return 0;
}

Win32中有几个地方需要使用
SetLastError
GetFileSize
等)清除错误,但如果需要,它会在MSDN的文档中调用。

这取决于函数。如果您发现一个函数的文档告诉您在调用该函数之前调用
WSASetLastError(0)
,请执行此操作

然而,这将是相当罕见的。与Win32错误代码(由
GetLastError
SetLastError
管理)一样,通常的模式是,如果函数指示失败,则只应调用
WSAGetLastError
。通常,故障由函数的返回值表示,但函数的返回值因函数而异,应该调用文档。通常的模式是这样的:

if (!some_function())
{
    int err = WSAGetLastError();
    // do something with err
}
通常,该函数只承诺在出现故障时调用WSASetLastError()。因此,人们犯的类错误是使用
WSAGetLastError()
检查错误。该代码如下所示:

// don't use this code, it is an anti-pattern
some_function();
int err = WSAGetLastError();
if (err != 0)
    // do something with err
}

您必须始终仔细阅读您调用的每个函数的文档,因为在使用中有很多不同的模式

这取决于功能。如果您发现一个函数的文档告诉您在调用该函数之前调用
WSASetLastError(0)
,请执行此操作

然而,这将是相当罕见的。与Win32错误代码(由
GetLastError
SetLastError
管理)一样,通常的模式是,如果函数指示失败,则只应调用
WSAGetLastError
。通常,故障由函数的返回值表示,但函数的返回值因函数而异,应该调用文档。通常的模式是这样的:

if (!some_function())
{
    int err = WSAGetLastError();
    // do something with err
}
通常,该函数只承诺在出现故障时调用WSASetLastError()。因此,人们犯的类错误是使用
WSAGetLastError()
检查错误。该代码如下所示:

// don't use this code, it is an anti-pattern
some_function();
int err = WSAGetLastError();
if (err != 0)
    // do something with err
}

您必须始终仔细阅读您调用的每个函数的文档,因为在使用中有很多不同的模式

请注意,在现代Winsock实现中,
WSAGetLastError()
实际上只是
GetLastError()
的别名,Winsock没有为套接字错误实现自己的独立错误代码,尽管Winsock规范暗示它实现了。在过去,IE/WinInet有一个注册表值,如果需要,可以使用自定义的wsock32.dll。这一点和Winsock LSP几乎让人倾向于走另一条路去做
#定义GetLastError WSAGetLastError
)表示TDI和LSP在Server 2012中已被弃用。请注意,在现代Winsock实现中,
WSAGetLastError()
实际上只是
GetLastError()
的别名,Winsock没有为套接字错误实现自己的独立错误代码,尽管Winsock规范暗示它实现了。在过去,IE/WinInet有一个注册表值,如果需要,可以使用自定义的wsock32.dll。这一点和Winsock LSP几乎让人倾向于走另一条路去做
#定义GetLastError WSAGetLastError
)说TDI和LSP在服务器2012中不推荐使用。