【问题标题】:Win32 ::shutdown() returns -1, but WSAGetLastError() returns 0?Win32 ::shutdown() 返回 -1,但 WSAGetLastError() 返回 0?
【发布时间】: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:“将消息写入文件” - 算作系统调用,这可能会重置错误代码。您需要在任何其他系统调用之前调用GetLastErrorWSAGetLastError
  • 我继续使用 shutdown() 调用重建库...我在 X_THROW 之前添加了对 WSAGetLastError() 的调用,果然,我得到了 10057...所以问题是... 是什么导致错误代码被清除?任何系统调用?

标签: winapi winsock2


【解决方案1】:

答案最终是几乎任何系统调用都可以清除 Win32 的“LastError()”错误...在我的情况下,抛出异常意味着格式化和记录一条消息,这会导致错误被清除...并且即使我在 catch(...) 中立即调用 WSAGetLastError() 已经为时已晚...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-15
    • 2014-05-16
    • 2023-03-15
    • 1970-01-01
    • 2016-10-19
    • 1970-01-01
    • 1970-01-01
    • 2013-08-14
    相关资源
    最近更新 更多