用于C++的套接字API或库?

The*_*boy 17 c++ sockets network-programming

我最近越来越多地使用C++.我用C做了一些(非常小的)套接字编程,但是对使用C++做一些工作很感兴趣.我只能在基于C的套接字实现上找到参考/教程.是否有一个原因?我知道,或者相信我知道你可以使用C套接字库来实现C++,但我不确定.

是否有比其他人更频繁使用的C++套接字库?这不是一个主观问题,我实际上是在寻找Socket API /库对C++的作用.

我在套接字编程和C++方面相当新,所以请不要回答任何问题.

谢谢

pts*_*pts 9

在这里,我试图回答一些你有所贡献的具体的事实问题.

是的,您可以在C++中使用任何C套接字库.如果它没有开箱即用,因为链接器报告了你想要使用的库函数的未定义引用,那么可以通过编辑.h库的文件来修复它,extern "C"在所有函数前面添加和全局变量声明.

要查找库,请访问http://freshmeat.net/,然后搜索C++ socketC socket.这是我发现的C++ socket:

正如拉斐尔在他的回答中提到的,你可能会发现Qt库的套接字部分很有用.有关参考,请参阅QTCpSocket,以及示例代码的fortune客户端.

此外,Boost.Asio已经出现在我的脑海中,但它可能会为您提供过多的抽象和低级细节.

C socket在freshmeat上搜索,你可能会找到一个比任何C++库都更适合的C库.

  • libsylph似乎根本不处理套接字或网络.socketw是一个非常薄的包装器.socket ++使得使用套接字非常容易,并且似乎没有提供任何方法来很好地使用套接字(非阻塞). (2认同)

Mat*_*att 5

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

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

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

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

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

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

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


编辑:说实话我不再使用 Boost ASIO 了。我发现它慢得可怕。使用 LibEV 或类似的或自己开发。Boost ASIO 似乎没有在 Linux 上使用 epoll。


Oma*_*lak 5

我用 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();
}
Run Code Online (Sandbox Code Playgroud)

这是服务器部分:

#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();
}
Run Code Online (Sandbox Code Playgroud)

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

这是感兴趣的人的 github:SocketClient

这是我在博客上制作的教程:因为你被卡住了