你需要清除WSAGetLastError(),如果是这样的话怎么样?

时间:2018-02-26 13:31:06

标签: winapi networking

在Unix中,某些函数调用不承诺清除TypeError: unsupported operand type(s) for +: 'int' and 'dict_values' ,因此您无法通过检查errno来检测错误,除非您在调用之前自行清除它。 E.g:

errno

在Windows上使用WSAGetLastError()代替errno。成功时,所有WSA功能是否都清除了最后一个错误?或者如果没有,有没有办法手动清除它?如果不是这样,你做什么?

2 个答案:

答案 0 :(得分:2)

不,你不需要清除它。如果函数失败,则只调用WSAGetLastError

正常模式只是:

if (0 != WSAEventSelect(...))
{
  int error = WSAGetLastError();
  handle_error(error);
}
else
{
  WaitForSingleObject(...);
  ...
}

您可以调用WSASetLastError函数,但通常没有理由。

Windows上的大多数功能都是实现的,因此它们只会在失败时设置错误代码。

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

Win32中有几个地方您需要使用SetLastErrorGetFileSize等)清除错误,但如果需要,可在MSDN上的文档中调出。

答案 1 :(得分:2)

这取决于功能。如果您找到一个函数,其文档告诉您在调用函数之前调用WSASetLastError(0),那么请执行此操作。

但是,这种情况非常罕见。与Win32错误代码(由GetLastErrorSetLastError管理)一样,通常的模式是,如果函数指示失败,则只应调用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
}

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