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