Winapi Win32::shutdown()返回-1,但WSAGetLastError()返回0?

Winapi Win32::shutdown()返回-1,但WSAGetLastError()返回0?,winapi,winsock2,Winapi,Winsock2,在将一些工作单元测试从Linux移植到Windows时,我遇到了一个奇怪的问题。似乎当我的测试要关闭服务器套接字时,shutdown()返回-1,但WSAGetLastError()返回0(getsockopt(带有SO_错误)返回0,GetLastError()返回0)。。。因此,shutdown()告诉我有一个错误,但是所有用于查看问题所在的正常调用都返回“没问题”。。。以前有人见过这个吗 调用shutdown的代码如下所示: int ret = ::shutdown( _sok, mode

在将一些工作单元测试从Linux移植到Windows时,我遇到了一个奇怪的问题。似乎当我的测试要关闭服务器套接字时,shutdown()返回-1,但WSAGetLastError()返回0(getsockopt(带有SO_错误)返回0,GetLastError()返回0)。。。因此,shutdown()告诉我有一个错误,但是所有用于查看问题所在的正常调用都返回“没问题”。。。以前有人见过这个吗

调用shutdown的代码如下所示:

int ret = ::shutdown( _sok, mode );
if( ret < 0 )
    X_THROW(( XSDK::ModuleId, XSDK::F_OS_ERROR, "Unable to shutdown socket."));
int-ret=::关机(_-sok,模式);
如果(ret<0)
X_THROW((XSDK::ModuleId,XSDK::F_OS_错误,“无法关闭套接字”);

当我捕获异常时,我调用所有那些GetLastError()函数。。。抛出会重置最后的错误吗?

答案是几乎任何系统调用都可以清除Win32的“LastError()”错误。。。在我的例子中,抛出一个异常意味着格式化和记录一条消息,这导致错误被清除。。。即使我在捕获中立即调用WSAGetLastError(),但已经太晚了

你能把密码寄出去吗?只是想知道你是否有这样的检查:
if(error=SOCKET\u error)
X\u THROW
做什么?如果它进行其他系统调用,可能会重置错误代码。查看X_THROW(),我看不到它做了任何可以清除错误的事情。。。它只是通过我们的记录器记录错误(在windows上,记录器将消息写入文件),然后创建一个异常对象并抛出它。。。我们的异常对象继承自std::exception..@dicroce:“将消息写入文件”-这将被视为系统调用,这可能会重置错误代码。您需要在任何其他系统调用之前调用
GetLastError
WSAGetLastError
。我继续使用shutdown()调用重建了库。。。在X_抛出之前,我添加了一个对WSAGetLastError()的调用,果然,我得到了10057。。。所以问题是。。。什么原因导致错误代码被清除?有系统调用吗?