6

我即将在 C++ 中开发一些与套接字相关的东西,并希望该软件从一开始就尽可能地在 Windows 和 Linux 之间移植(让它以后移植很棘手。)

我查看了不同的库,有一个来自alhem.net的 C++ 库,当然还有 boost::asio。boost::asio 看起来很有前途,但对于这么小的应用程序来说将是一个非常大的依赖项。

自己写这些东西是否值得,还是我应该只使用图书馆?如果我自己做,主要的陷阱是什么?

4

6 回答 6

5

我开发了一些围绕套接字的便携式包装器。确保您不会走下由 WinSock2 事件构成的糟糕的不归路。除此之外,在我看来,最大的区别是:

  • 要在 Windows 中启动网络,您需要调用::WSAStartup(), 在 Windows 中将其关闭,运行::WSACleanup(); 在 Linux 中什么都不做,
  • close()在 Linux 中是closesocket()在 Windows 中,
  • 驱动程序和操作系统之间的默认缓冲区大小不同,因此请确保使用SO_RCVBUFand来设置它们SO_SNDBUF
  • SO_REUSEADDR 在 Windows 上窃取地址,允许在 Linux 上频繁重新打开;你可能只想在 Linux 中使用这个标志,
  • ::ioctlsocket()在 Windows、Linux ::fcntl()
  • 头文件不一样,<sys/socket.h>朋友在Linux,<WinSock.h>在Windows,
  • 要便携,最简单的方法可能是使用::select()等待数据到达,
  • fd_sets 在 Windows/Linux 上完全不同;这仅在您需要优化fd_sets 的初始化时才相关,例如在添加/删除任意套接字时,
  • 在 Windows 中,当套接字关闭时,挂在套接字上的任何线程都会被释放并带有错误代码,在 Linux 中,线程保持等待。如果线程正在阻塞套接字,例如::recvfrom(),您可以考虑::sendto()在 Linux 下使用来释放停止的线程。

我曾经需要的其他一切都是从 låda 中解决的。

于 2009-06-15T12:25:47.447 回答
3

Winsocks 与 Posix 套接字不太兼容:

  • 在 Winsocks 中,套接字的类型是SOCKET. 在 Posix 上,它只是一个文件描述符 ( int),您可以在其上执行正常read()write()调用。
  • 它们不会以相同的方式返回错误。
  • 他们不支持recv()和上的某些选项send()
  • 您必须使用两个特殊函数初始化和统一 Winsocks 库。
  • 我认为您不能使用shutdown()or关闭 Windows 套接字close()。而是类似的东西closesocket()

肯定有更多的不同,但这就是我现在能记住的。如果您希望 Winsocks 具有可移植性,您将拥有一个用于关闭套接字、打印错误消息等的小型库。

我个人可能会选择boost::asio(不过我从未使用过它)。

于 2009-05-06T14:04:28.683 回答
2

看看“自适应通信环境”(ACE)库: (ACE 主页) 它提供了一些很好的抽象和很大的灵活性,所有这些都集中在一个支持 Windows、MacOS 和 Linux 的可移植库中。它的学习曲线有点陡峭,但我从中获得了很好的价值。

于 2009-06-16T07:18:41.897 回答
1

老实说,我会优先使用 boost::asio。如果你真的想对套接字 API 感到厌烦,你可以在 Windows 和 Linux 上使用标准的 BSD 风格的套接字 API——只是在 Windows 上你必须链接到(并初始化)Winsock2,而在Linux 你不会有一个单独的库来链接。

于 2009-05-06T13:46:17.573 回答
1

您将使用多少插座的东西?我已经完成了几个应用程序,其中套接字的东西非常高级(打开、读取、写入),并且从 Windows 到 Linux 都可以完美运行。如果它不止于此 - 继续提升。

于 2009-05-06T13:47:46.197 回答
1

看看这个... http://sourceforge.net/projects/cpp-sockets/

于 2009-06-24T18:31:36.773 回答