【发布时间】:2010-11-10 17:33:18
【问题描述】:
在将一些工作单元测试从 Linux 移植到 Windows 时,我遇到了一个奇怪的问题。看来,当我的测试关闭服务器套接字时,shutdown() 返回-1,但 WSAGetLastError() 返回 0(并且 getsockopt( 带有 SO_ERROR ) 返回 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."));
当我捕捉到异常时,我会调用所有这些 GetLastError() 函数... throwing 会重置最后的错误吗?
【问题讨论】:
-
你能发布代码吗?只是想知道你有像
if (error = SOCKET_ERROR)这样的支票... -
X_THROW是做什么的?如果它进行其他一些系统调用,则可能会重置错误代码。 -
查看 X_THROW(),我没有看到它做任何可以清除错误的事情......它只是通过我们的记录器记录错误(在 Windows 上,将消息写入文件)然后创建一个异常对象并抛出它……我们的异常对象继承自 std::exception..
-
@dicroce:“将消息写入文件” - 算作系统调用,这可能会重置错误代码。您需要在任何其他系统调用之前调用
GetLastError或WSAGetLastError。 -
我继续使用 shutdown() 调用重建库...我在 X_THROW 之前添加了对 WSAGetLastError() 的调用,果然,我得到了 10057...所以问题是... 是什么导致错误代码被清除?任何系统调用?