代码之家  ›  专栏  ›  技术社区  ›  Skurmedel

Winsock 2可移植性

  •  6
  • Skurmedel  · 技术社区  · 16 年前

    我将在C++中开发一些与套接字相关的东西,并希望软件能够在Windows和Linux之间尽可能方便地移植。

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

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

    6 回复  |  直到 15 年前
        1
  •  3
  •   Bastien Léonard    16 年前

    Winsock与POSIX套接字不太兼容:

    • 在Winsocks中,套接字的类型为 SOCKET . 在POSIX上,它只是一个文件描述符( int ,可以正常运行 read() write() 电话。
    • 它们不会以同样的方式返回错误。
    • 他们不支持 recv() send() .
    • 您必须用两个特殊函数初始化和统一Winsocks库。
    • 我想你不能用 shutdown() close() . 有点像 closesocket() 相反。

    一定有更多的区别,但这就是我现在能记住的。如果您想要使用Winsock的可移植性,您将拥有一个小的库来关闭一个套接字,打印一条错误消息等等。

    我可能会同意 boost::asio 个人而言(不过我从未用过)。

        2
  •  5
  •   Jonas Byström    15 年前

    我在插座周围开发了一些便携式包装器。确保你不会沿着由Winsock2事件构成的无回报的糟糕通道走下去。除此之外,我认为最大的区别是:

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

    我所需要的一切都是从地方检察官那里得到的。

        3
  •  2
  •   Bruce Ikin    15 年前

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

        4
  •  1
  •   Jeff    16 年前

    你要用多少插座?我做过一些应用程序,其中的socket功能相当高(打开、读取、写入),从Windows到Linux都能很好地工作。如果还不止这些,那就加油吧。

        5
  •  1
  •   Harper Shelby damiankolasa    16 年前

    老实说,我会把boost::asio作为首选。如果你真的想对sockets api下手,那么你可以在windows和linux上使用标准的bsd风格的sockets api——在windows上,你必须链接(并初始化)winsock2,而在linux上,你没有单独的库来链接。

        6
  •  1
  •   Partial    15 年前