【问题标题】:Socket API or library for C++? [closed]用于 C++ 的套接字 API 或库? [关闭]
【发布时间】:2010-11-16 21:30:17
【问题描述】:

我最近对 ​​C++ 有了更多的了解。我已经用 C 完成了一些(非常少的)套接字编程,但对用 C++ 做一些工作很感兴趣。我只能找到关于基于 C 的套接字实现的参考/教程。是否有一个原因?我知道或相信我知道您可以将 C 套接字库用于 C++,但不确定。

是否有比其他人更频繁使用的 C++ 套接字库?这不是一个主观问题,我实际上是想找出 C++ 的 Socket API/库是什么。

我是套接字编程和 C++ 的新手,所以请不要回答会让我陷入困境的答案。

谢谢

【问题讨论】:

  • 任何套接字库的一个重要测试是它是否公开事件。 Qt 可以,本机 Win32 套接字 API 可以(请参阅 WSAAsyncSelect),BSD 套接字使事件成为可能,但并不容易(selectpoll,与名称相反的是事件驱动,而不是轮询,或 @987654325 @)。许多其他库迫使您采用阻塞式每个连接一个线程的样式,这不仅效率低下,而且会导致错误。这里的复杂之处在于您的套接字事件和 UI 或串行端口或您的程序处理的任何其他事件必须在单个事件循环中兼容。
  • 2020 - 如果您使用的是 C++ 17 编译器,kissnet 是支持 OpenSSL 的最小跨平台套接字 API

标签: c++ sockets network-programming


【解决方案1】:

在这里,我试图回答您的一些具体的、事实性的问题,我有一些贡献。

是的,您可以在 C++ 中使用任何 C 套接字库。如果由于链接器报告您要使用的库函数的未定义引用而无法开箱即用,则可以通过编辑.h 文件来修复它库,在所有函数和全局变量声明前添加extern "C"

要查找库,请转到 http://freshmeat.net/,然后搜索 C++ socketC socket。这是我为C++ socket 找到的内容:

正如 Raphael 在他的回答中提到的,您可能会发现 Qt 库的套接字部分很有用。参考QTCpSocket,示例代码见fortune client

我也想到了Boost.Asio,但它可能有太多的抽象和低级细节暴露给你。

在freshmeat 上搜索C socket,您可能会发现比任何C++ 库都更适合的C 库。

【讨论】:

  • libsylph 似乎根本不处理套接字或网络。 socketw 是一个非常薄的包装器。 socket++ 使得使用套接字变得非常容易,并且似乎没有提供任何方式来很好地使用套接字(非阻塞)。
  • 大声笑,还记得鲜肉吗?
【解决方案2】:

我只能找到基于 C 的套接字实现的参考/教程。这是有原因的吗?

可能是因为所有的socket实现都是基于原始的C语言berkeley socket api,它定义了recv、send、listen、accept、select等函数。

我强烈建议您查看 Boost ASIO。它是一个跨平台的 C++ API,因此您开发的任何代码都是可移植的。事实上,您会发现许多其他 Boost 库对您有用,而且它们都是跨平台的。

参考基本API。您可以在 Windows 和 Linux 中使用原始套接字 C 函数。但是,请注意,在 windows 下存在一些细微差别。例如您必须先调用 WSAstartup 函数。

Beej 的网络编程指南是对基本套接字编程的一个非常好的参考

http://beej.us/guide/bgnet/

即使您使用的是 C++ api,我也建议您阅读一下它,因为它可以让您了解正在发生的事情。


编辑:老实说,我不再使用 Boost ASIO。我发现它非常慢。使用 LibEV 或类似的或自己滚动。 Boost ASIO 似乎没有在 Linux 上使用 epoll。

【讨论】:

    【解决方案3】:

    我在 c++ 中开发了一个用于套接字的库,但仅适用于 Windows。 它提供了一个面向对象的实现,带有用于接收消息的回调!

    这是我从客户端建立连接的方式:

    #include <iostream>
    #include <winsock2.h>
    #include "SocketClient.h"
    
    using namespace std;
    
    void onError(errorStruct *e)
    {
        cout << e->code << " : " << e->message << endl;
    }
    
    int main()
    {
        SocketClient client("127.0.0.1", 5555);
        client.setErrorCallback(onError);
        client.connect();
        client.send("Hello World!");
        client.close();
    }
    

    这是服务器部分:

    #include <iostream>
    #include <winsock2.h>
    #include "SocketClient.h"
    #include "SocketServer.h"
    
    using namespace std;
    
    bool good=true;
    
    void messageReceived(messageStruct *s)
    {
        cout << "client: " << s->message << endl;
    }
    
    void errorOccurred(errorStruct *e)
    {
        cout << e->code << " : " << e->message << endl;
        good=false;
    }
    
    int main()
    {
        SocketServer server(5555);
        SocketClient client(server.accept());
        client.setErrorCallback(errorOccurred);
        client.setMessageCallback(messageReceived);
    
        while(good){};
    
        client.close();
        server.close();
    }
    

    如您所见,它实现了用于接收消息和处理错误的回调。

    这里是github:SocketClient

    这是我在博客上制作的教程:Cause You're Stuck

    【讨论】:

      【解决方案4】:

      我喜欢使用 Qt 来编写套接字。它提供了一个面向对象的实现并且它是多平台的

      【讨论】:

      • 但是将它与不同的线程一起使用是一件很可怕的事情。 (您必须在两者之间处理信号)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-19
      • 2010-09-18
      • 1970-01-01
      • 1970-01-01
      • 2011-02-15
      • 1970-01-01
      • 2011-09-04
      相关资源
      最近更新 更多