【问题标题】:Porting Windows platform C++ to POSIX (Linux) C++ - WSAGetLastError()将 Windows 平台 C++ 移植到 POSIX (Linux) C++ - WSAGetLastError()
【发布时间】:2010-05-04 15:19:38
【问题描述】:

我目前正在将一些 Windows 移动 C++ 代码移植到标准 C++。

所以我正在尝试寻找 Windows 特定功能的替代方案。

我几乎没有找到一个标准的 C++ 函数来帮助我替换 WSAGetLastError() Windows 特定函数。

WSAGetLastError() 返回窗口中套接字发生的错误的错误号。

所以我想知道是否有人知道在标准 c++ 中替换此函数的方法?

为连接/断开套接字的不同结果获取不同错误号的方法就足够了。

【问题讨论】:

  • 没有“Windows C++”之类的东西,您也没有尝试移植到“标准 C++”。您正在尝试将您的程序从 Windows 平台移植到 POSIX 平台。两者都与标准 C++ 没有太大关系。
  • 您应该注意到所有套接字函数的文档都告诉您它们存储错误信息的位置。例如:linux.die.net/man/2/bind。无论如何,您将阅读所有这些文档,因为套接字函数在不同操作系统上的工作方式不同。 Linux 上的套接字函数的行为不一定与 Windows 上具有相同名称的函数相同。密切关注极端案例。
  • 感谢您提供更多信息,非常感谢

标签: c++ linux error-handling porting


【解决方案1】:

没有标准 C++ 函数支持套接字。但是,POSIX 套接字函数都应该将 errno 变量设置为错误 - 您只需要检查这一点 - 它应该在 errno.h 中声明。

【讨论】:

  • 如果您使用的是非阻塞连接,那么您还需要使用getsockopt(socket, SOL_SOCKET, SO_ERROR, ...); 来获得connect() 状态。请注意 errno 在成功操作时不会更改 - 因此您可能希望在每次操作之前将其专门设置为零。
  • 将 errno 设置为零不是好的做法。您应该只在函数调用返回值指示错误时检查它。
【解决方案2】:

我会移植到 Boost.ASIO,它将抽象网络差异,并可能通过使用异步调用和重叠 IO 为您提供更好的性能。完成后,您的代码将在任何提升工作的地方工作。

【讨论】: