【问题标题】:What is a popular, multi-platform, free and open source socket library [closed]什么是流行的、多平台的、免费的开源套接字库 [关闭]
【发布时间】:2010-12-07 22:03:13
【问题描述】:

是否有任何免费的开源库(C/C++ 格式)用于广泛使用并支持广泛的操作系统(Windows、Unix/Linux、FreeBSD 等)的套接字。就像 pthreads。

否则,剩下的唯一解决方案就是为每个操作系统编写套接字包装器。或者编写一个针对 winsock 和 GNU C sys/socket.h 库的包装器就足够了?

难道我不能针对 GNU C 提供的套接字库来实现它。GNU C 可用于广泛的平台,我的代码可以在所有这些平台上运行吗?

【问题讨论】:

  • 请注意,C 和 C++ 会给出完全不同的答案。仅仅因为它们相似并不意味着您应该同时标记问题。如果您想要 C++ 库,请将其标记为 C++ - 与本机 C++ 库相比,C 库将相当笨拙。
  • 我正在编写一个 c++ 库,但如果实现是用 C 编写的,我可以。我可以同时使用。
  • 难道我不能针对 GNU C 提供的套接字库来实现它吗?GNU C 可用于各种平台,我的代码可以在所有这些平台上运行。

标签: c++ c sockets


【解决方案1】:

考虑查看boost

【讨论】:

【解决方案2】:

QT 如果它对你来说不是太大的话。 Boost 也有一些网络代码。 wxWidgets 在 wxNet 中也有一个网络库。另一个库是Clanlib。当然还有SDL

【讨论】:

    【解决方案3】:

    我相信Apache Portable Runtime 和 GTK+ 的 GLib 库都有套接字 API。由于您的问题被标记为 cc++,我怀疑您确实想要以 C++ 为中心的答案,但这两者都可以作为纯 C 库。

    【讨论】:

    • Apache Portable Runtime 是一个很好的建议。 Apache 也使用它,所以我认为它会稳定、可扩展且具有良好的性能。 GLib 完全支持 UNIX,但部分支持 windows。
    【解决方案4】:

    ACE 可以帮助你!

    本教程概述了 ACE OS 适配层及其 C++ Socket 包装器的设计和使用

    Developing Efficient and Portable Communication Software with ACE and C++

    【讨论】:

    • 如果您看一下 ACE,请不要被它的大小所淹没。核心 ACE 库具有易于使用的 TCP 和 UDP 类。在线文档几乎是参考。获取《ACE 程序员指南》一书以了解如何使用它。
    【解决方案5】:

    使用 boost::asio。非常好的图书馆。按照这个链接 http://www.boost.org/doc/libs/1_40_0/doc/html/boost_asio.html

    【讨论】:

      【解决方案6】:
      【解决方案7】:

      您可以尝试的另一个选项是Poco。 Poco 的功能远不止套接字,所以如果您需要其他东西,它也可以提供。

      将其与其他工具包进行比较:

      1. Qt 具有 GUI 和一些在 Poco 中找不到的非常复杂的功能,但它要大得多。
      2. Boost 在实际功能方面没有 Poco 那么多,但它具有引用包装器、MPL 和预处理器等库,这些库在其他任何地方都找不到。
      3. 我不太记得ACE,但我记得它在源代码和组件方面非常非常大。 ACE 似乎用于非常高性能的网络应用程序,所以它可能是矫枉过正。但话又说回来,我不太确定。

      只要我的两分钱

      【讨论】:

      • 从支持的平台列表中,我找不到 UNIX/Linux。另一方面,他们更加重视嵌入式平台。
      • Poco 支持的平台?他们确实支持 Unix/Linux。它在底部的主页上:Linux;惠普-UX;特鲁64;索拉里斯。所有这些都是 Unix 或类 Unix 操作系统。
      【解决方案8】:

      是的,使用 Winsock 和标准 Berkeley 套接字的包装器,您会走得很远。事实上,差异是如此之小,几乎可以直接在代码中使用#ifdef

      也就是说,如果您愿意在套接字级别工作。如果你追求更抽象的东西,那么包装它当然会给你一个很好的机会来隐藏差异。

      尤其是 Winsock:

      • 要求您通过在任何其他套接字函数之前调用 @987654321@ 来“启动”它
      • 不允许您在套接字上使用普通的旧 close();你必须使用@987654322@
      • 要求您使用@987654323@ 来获取最后一个错误,而不是简单的errno

      这是我脑海中最重要的三个,可能还有更多。

      【讨论】:

      • 为什么?之前已经做过几十次了,我怀疑你找不到你喜欢的界面。
      • @Chris:为什么? :) 为什么在套接字级别工作?我不知道,有时它是有道理的,但你仍然可能想要便携。
      • 我正在考虑编写一个可以隐藏差异的类(如果必须的话,请抽象一下)。我可以从该类派生一个用于 winsock 和 Linux 套接字或任何其他库的实现。那就是如果我找不到一个小而高效的图书馆。
      • @unwind:我无法为 Chris 发表评论,但我会问:如果有这么多实现,为什么要自己做呢?
      • 没有东西要包为什么还要包呢? BSD 套接字调用无处不在。
      【解决方案9】:

      如果您想要一个非常轻量的、仅 C++ 的、iostreams 风格的 BSD 套接字包装器,您可以考虑 skstream - 它很简单而且效果很好。当然,iostreams 接口本身还有很多不足之处。不过,skstream 确实为您包装了 select 和非常低级的套接字处理。

      【讨论】:

        【解决方案10】:

        这里只有一个正确答案。 OpenSSL。因为一旦你有了套接字代码,你也会想要建立 SSL 连接。如果您已经在使用特定的跨平台框架,那么 OpenSSL 绑定可能已经可用。 我认为现在没有太多理由不让您的应用程序从一开始就启用 SSL/TLS。

        【讨论】:

        • 抱歉,我们讨论的是套接字编程,而不是会话层或安全性。
        猜你喜欢
        • 2010-11-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多