Winsock 2便携性

Sku*_*del 6 c++ portability winsock

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

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

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

Jon*_*röm 5

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

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

我所需要的其他所有东西都是出自låda.


Bas*_*ard 3

Winsocks 与 Posix 套接字不太兼容:

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

肯定还有更多的差异,但这就是我现在能记得的。如果您想要 Winsocks 的可移植性,您将拥有一个用于关闭套接字、打印错误消息等的小型库。

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