一个流行的,跨平台的,免费且开源的套接字库是什么?

9
有没有一款广泛使用且支持多种操作系统(如Windows、Unix/Linux、FreeBSD等)的免费开源套接字库(用于C/C++)?就像pthread一样。
否则,唯一的解决方案就是为每个操作系统编写套接字包装器。或者编写针对winsock和GNU C sys/socket.h库的包装器是否足够?
我能否只针对GNU C提供的套接字库进行实现呢?GNU C可用于各种平台,我的代码将在所有这些平台上工作,这不可能吗?

2
请注意,C和C++会给出非常不同的答案。仅仅因为它们相似并不意味着您应该同时标记问题。如果您想要C++库,请标记为C++ - 与本地C++库相比,C库将显得相当笨拙。 - Chris Lutz
我正在编写一个C++库,但如果实现是用C语言的话,我也可以接受。我两种语言都能使用。 - ata
1
我能否使用GNU C提供的套接字库来实现它呢?GNU C适用于广泛的平台,我的代码将在所有这些平台上运行。 - ata
10个回答

13

1
boost.asio也可作为一个独立的软件包使用。http://think-async.com/Asio/ - KitsuneYMG

8

QT如果对你来说不太大的话,也可以使用。 Boost也有一些网络代码。 wxWidgets也有一个名为wxNet的网络库。另一个库是Clanlib。当然还有SDL


4
我认为Apache Portable Runtime和GTK+的GLib库都有套接字API。由于您的问题标记为cc++,我猜测您真正想要的是以C++为中心的答案,但这两个库都可以作为纯C库使用。

Apache Portable Runtime是一个不错的建议。Apache也在使用它,所以我认为它会很稳定、可扩展且性能良好。 GLib对UNIX有完全支持,但对Windows的支持是部分的。 - ata

4

如果你看ACE,不要被它的大小吓到。核心ACE库有易于使用的TCP和UDP类。在线文档基本上是参考资料。获取书籍“ACE程序员指南”以学习如何使用它。 - zooropa

3

如果你使用Winsock和标准的Berkeley sockets进行封装,那么你会取得很大的进展。实际上,它们之间的差异非常小,几乎可以直接在代码中使用#ifdef来完成。

也就是说,如果你愿意在socket层面工作的话。如果你想要更抽象的东西,那么封装它当然也给了你一个很好的机会来隐藏这些差异。

特别是,Winsock:

  • 要求在调用任何其他socket函数之前调用WSAStartup()来“启动它”
  • 不允许你在socket上使用普通的close()函数;你必须使用closesocket()
  • 要求你使用WSAGetLastError()来获取最后一个错误,而不是普通的errno
那是我能想到的三个主要问题,可能还有其他的。

1
为什么?这已经做了数十次,我怀疑你找不到自己喜欢的界面。 - Chris Lutz
@Chris:为什么什么? :) 为什么要在套接字层工作?我不知道,有时候这是有意义的,但你仍然可能希望具备可移植性。 - unwind
我正在考虑编写一个类(如果必要的话,可以是抽象类),它将隐藏差异。我可以从该类派生出winsock和Linux套接字或任何其他库的实现。 这是在我找不到一个小而高效的库的情况下。 - ata
1
@unwind:我不能代表Chris发表意见,但我会问一下:如果有这么多实现,为什么要自己编写呢? - sbi
为什么要包装它,当没有东西需要包装呢?BSD套接字调用可以在任何地方工作。 - Chris Becke
显示剩余2条评论

3


3
另一个你可以尝试的选择是Poco。Poco不仅仅有sockets,还提供其他东西。
与其他工具包相比:
  1. Qt有GUI和一些非常复杂的功能,你在Poco中找不到,但它更大。
  2. Boost在实际功能方面没有Poco那么多,但它有像引用包装器、MPL和预处理器这样的库,在其他地方找不到。
  3. 我记不太清ACE了,但我记得它在源代码和组件方面非常庞大。ACE似乎被用于非常高性能的网络应用程序,所以可能过度了。但我也不太确定。
只是我的两分钱。

从支持的平台列表中,我找不到UNIX/Linux。另一方面,他们更加强调嵌入式平台。 - ata
1
Poco支持哪些平台?它们支持Unix/Linux。这在主页底部有说明:Linux;HP-UX;Tru64;Solaris。所有这些都是类Unix或Unix操作系统。 - blwy10

1
如果你想要一个非常轻量级的、仅限于C++的、基于BSD sockets的iostreams风格封装,那么你可以考虑使用skstream——它简单易用且效果不错。当然,iostreams接口本身还有很多需要改进的地方。但是,skstream确实很好地封装了select和非常底层的socket处理过程。

-2

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


1
抱歉,我们正在讨论套接字编程,而不是会话层或安全性。 - Test

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接