我最近越来越多地使用C ++。我用C做了一些(非常小的)套接字编程,但是对使用C ++做一些工作很感兴趣。我只能在基于C的套接字实现上找到参考/教程。是否有一个原因?我知道,或者相信我知道你可以使用C套接字库来实现C ++,但我不确定。
是否有比其他人更频繁使用的C ++套接字库?这不是一个主观问题,我实际上是在寻找Socket API /库对C ++的作用。
我在套接字编程和C ++方面相当新,所以请不要回答那些会让我陷入困境的答案。
由于
答案 0 :(得分:9)
在这里,我试图回答一些我有所贡献的具体的事实问题。
是的,您可以在C ++中使用任何C套接字库。如果由于链接器为您要使用的库函数报告未定义的引用而无法开箱即用,则可以通过编辑.h
文件来修复它( s)在所有函数和全局变量声明之前添加extern "C"
。
要查找图书馆,请转到http://freshmeat.net/,然后搜索C++ socket
或C socket
。以下是我为C++ socket
找到的内容:
正如Raphael在他的回答中提到的,你可能会发现Qt库的套接字部分很有用。请参阅QTCpSocket以供参考,fortune client代码示例。
Boost.Asio也出现在我的脑海中,但可能会有太多的抽象和低级细节暴露给你。
在freshmeat上搜索C socket
,您可能会找到一个比任何C ++库都更适合的C库。
答案 1 :(得分:4)
我只能在基于C的套接字实现上找到参考/教程。有这个原因吗?
可能是因为所有套接字实现都基于原始的C语言berkeley socket api,它定义了recv,send,listen,accept,select等函数。
我强烈建议您查看 Boost ASIO。这是一个跨平台的C ++ API,因此您开发的任何代码都是可移植的。实际上,您会发现许多其他对您有用的Boost库都是跨平台的。
参考基本API。您可以在Windows和Linux中使用原始套接字C函数。但是,请注意,在Windows下有一些细微的差别。例如你必须先调用WSAstartup函数。
基本套接字编程的一个非常好的参考是 Beej的网络编程指南。
即使您使用的是C ++ API,我也建议您稍微阅读一下,因为它可以帮助您了解正在发生的事情。
编辑:说实话,我不再使用Boost ASIO了。我发现它非常慢。使用LibEV或类似或自己滚动。 Boost ASIO似乎没有在Linux上使用epoll。
答案 2 :(得分:4)
我在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
答案 3 :(得分:3)
我喜欢使用Qt编程套接字。它提供了面向对象的实现,它是多平台的