gpt4 book ai didi

c++ - Winsock 2 可移植性

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:12:22 26 4
gpt4 key购买 nike

我正准备用 C++ 开发一些与套接字相关的东西,并希望该软件从一开始就尽可能在 Windows 和 Linux 之间可移植(稍后使其可移植很棘手。)

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

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

最佳答案

我开发了一些围绕套接字的可移植包装器。确保您不会走上由 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 的 friend ,<WinSock.h>在 Windows 中,
  • 要便携,最简单的方法可能是使用 ::select()等待数据到达,
  • fd_set s 在 Windows/Linux 上完全不同;这仅在您需要优化 fd_set 的初始化时才有意义s,例如添加/删除任意套接字时,
  • 在 Windows 中,任何卡在套接字上的线程都会在套接字关闭时释放,并带有错误代码,在 Linux 中,线程将继续等待。如果线程正在阻塞套接字,例如 ::recvfrom() , 你可以考虑使用 ::sendto()在 Linux 下释放停滞的线程。

我需要的所有其他东西都可以从 låda 中解决。

关于c++ - Winsock 2 可移植性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/829625/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com