Winsock 2便携性

时间:2009-05-06 13:42:03

标签: c++ winsock portability

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

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

是否值得自己写这些东西或者我应该只使用一个库?如果我自己这样做会有什么主要的陷阱?

6 个答案:

答案 0 :(得分:5)

我在套接字周围开发了一些便携式包装器。确保你没有沿着由WinSock2事件构成的无法回归的蹩脚线路走下去。除此之外,正如我所看到的,最大的区别是:

  • 要在Windows中启动网络,您需要致电::WSAStartup(),在Windows中关闭它,运行::WSACleanup();在Linux中什么都不做,
  • Linux中的
  • close()在Windows中为closesocket()
  • 默认缓冲区大小因驱动程序和操作系统而异,因此请务必使用SO_RCVBUFSO_SNDBUF
  • 进行设置。
  • SO_REUSEADDR窃取Windows上的地址,允许在Linux上频繁重新打开;你可能只想在Linux中使用这个标志,
  • 使套接字无阻塞在Windows中使用::ioctlsocket(),在Linux中使用::fcntl()
  • 头文件不同,<sys/socket.h>和Linux中的朋友,Windows中的<WinSock.h>
  • 要便携,最简单的方法可能是使用::select()等待数据到达,
  • fd_set在Windows / Linux上完全不同;这仅在您需要优化fd_set的初始化时才有意义,例如在添加/删除任意套接字时,
  • 在Windows中,当套接字关闭时,套接字上挂起的任何线程都会发布错误代码,在Linux中线程仍在等待。如果线程阻塞了例如::recvfrom()的套接字,您可以考虑使用::sendto()来释放Linux下的停滞线程。

我所需要的其他所有东西都是从låda中完成的。

答案 1 :(得分:3)

Winsocks与Posix套接字不兼容:

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

必须有更多的差异,但这就是我现在能记住的。如果你想使用Winsocks进行移植,那么你将拥有一个小型库来关闭套接字,打印错误信息等等。

我可能会和boost::asio人一起去(我从来没有用过它)。

答案 2 :(得分:2)

查看“自适应通信环境”(ACE)库: (ACE Home Page) 它在一个支持Windows,MacOS和Linux的便携式库中提供了一些很好的抽象和很多灵活性。 它有一点陡峭的学习曲线,但我从中获得了非常好的价值。

答案 3 :(得分:1)

老实说,我会先使用boost :: asio作为首选。如果你真的想要了解套接字API,你可以在Windows和Linux上使用标准的BSD风格的套接字API - 只是在Windows上你必须链接到(并初始化)Winsock2,而在Linux你不会有一个单独的库链接。

答案 4 :(得分:1)

你将使用多少套接字?我已经完成了几个应用程序,其中套接字的东西非常高(开放,读取,写入),并且从Windows到Linux完美地工作。如果不止于此 - 请加强。

答案 5 :(得分:1)