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

Socket API还是C++库?[关闭]

  •  15
  • TheJediCowboy  · 技术社区  · 14 年前

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

    是否有一个C++套接字库被更多地使用?这不是一个主观问题,我实际上是想找出Socket API的哪些库是C++的。

    在套接字编程和C++方面,我是相当新的,所以请不要回答我的循环。

    谢谢

    4 回复  |  直到 8 年前
        1
  •  9
  •   feedc0de RushPL    8 年前

    在这里,我试着回答你的一些具体的、事实性的问题,我对此有一些贡献。

    是的,你可以在C++中使用任何C套接字库。如果由于链接器报告 符号未找到 对于要使用的库函数,可以通过编辑 .h 库的文件,添加 extern "C" 在所有函数和全局变量声明之前。

    要查找库,请转到 http://freshmeat.net/ ,并搜索 C++ socket C socket . 这是我找到的东西 C++套接字 :

    正如拉斐尔在他的回答中提到的,您可能会发现qt库的socket部分很有用。见 QTCpSocket 供参考,以及 fortune client 例如代码。

    阿尔索 Boost.Asio 我突然想到,但它可能有太多的抽象和低级的细节为您公开。

    做你的搜索 C插座 在新鲜肉上,你可以找到一个C库,它比任何C++库都好。

        2
  •  4
  •   hookenz    11 年前

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

    可能是因为所有的套接字实现都基于原始的C语言Berkeley Socket API,它定义了诸如recv、send、listen、accept、select等函数。

    我强烈推荐你看看 提高ASIO。 它是一个跨平台的C++ API,所以开发的任何代码都是可移植的。实际上,您会发现许多其他的boost库对您很有用,它们都是跨平台的。

    参考基本API。您可以在Windows和Linux中使用原始的socket c函数。但是,请注意,在窗户下面有一些细微的差别。例如,您必须首先调用wsastartup函数。

    对基本套接字编程的一个很好的参考是 网络编程指南 .

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

    我建议你读一读,即使你使用C++ API,因为它能让你了解正在发生的事情。


    编辑:老实说,我不再使用BoostAsio了。我发现它慢得可怕。使用libev或类似的,或滚你自己的。BoostAsio在Linux上似乎没有使用epoll。

        3
  •  4
  •   Omar Aflak    8 年前

    我开发了一个用于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
  •  3
  •   Raphael    14 年前

    我喜欢用qt来编程套接字。它提供了一个面向对象的实现和它的多平台