【问题标题】:Get formatted message for WSA error codes获取 WSA 错误代码的格式化消息
【发布时间】:2011-01-08 10:23:26
【问题描述】:

我在一个 win32 c++ 应用程序中使用了 winsock2。我将使用 MessageBox 显示可以通过调用 WSAGetLastError() 检索的网络错误。我怎样才能做到这一点?我看到了 FormatMessage 但我不明白如何使用它

【问题讨论】:

    标签: c++ winsock2


    【解决方案1】:

    例如,下面是在系统的消息表中搜索错误代码并将格式化的消息放在LPTSTR Error缓冲区中。

    // Create a reliable, stream socket using TCP.
    
    if ((sockClient = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
    {
     DWORD err = GetLastError();
     LPTSTR Error = 0;
    
    if(FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
           NULL,
           err,
           0,
           (LPTSTR)&Error,
           0,
           NULL) == 0)
      {
         // Failed in translating the error.
      }
    }
    

    【讨论】:

    • 它有效,但我有两个问题:当我可以简单地写错误时,为什么我应该将 &Error 转换为 LPTSTR?我应该使用 LocalFree(Error) 释放内存吗?
    • 因为那样你就会将指针的地址(它需要一种指向指针的指针)传递给另一个指针,并且因为FORMAT_MESSAGE_ALLOCATE_BUFFER 标志应该为 @ 指向的消息分配缓冲区987654326@。当不再需要内存时,您必须释放它。
    • 新应用程序应使用HeapFree() 而不是LocalFree()。在这种情况下,您需要HeapFree(GetProcessHeap(), 0, Error)msdn.microsoft.com/en-us/library/aa366596(v=vs.85).aspx
    【解决方案2】:

    【讨论】:

      【解决方案3】:

      在 C++11 中,您可以使用:

      std::system_category().message(WSAGetLastError());
      

      将您的消息作为 std::string 获取并避免所有讨厌的缓冲区内容:)

      请参阅 the function documentationthis answer that uses it to throw exceptions

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-31
        • 1970-01-01
        • 2016-07-08
        相关资源
        最近更新 更多