The*_*boy 17 c++ sockets network-programming
我最近越来越多地使用C++.我用C做了一些(非常小的)套接字编程,但是对使用C++做一些工作很感兴趣.我只能在基于C的套接字实现上找到参考/教程.是否有一个原因?我知道,或者相信我知道你可以使用C套接字库来实现C++,但我不确定.
是否有比其他人更频繁使用的C++套接字库?这不是一个主观问题,我实际上是在寻找Socket API /库对C++的作用.
我在套接字编程和C++方面相当新,所以请不要回答任何问题.
谢谢
在这里,我试图回答一些你有所贡献的具体的事实问题.
是的,您可以在C++中使用任何C套接字库.如果它没有开箱即用,因为链接器报告了你想要使用的库函数的未定义引用,那么可以通过编辑.h
库的文件来修复它,extern "C"
在所有函数前面添加和全局变量声明.
要查找库,请访问http://freshmeat.net/,然后搜索C++ socket
或C socket
.这是我发现的C++ socket
:
正如拉斐尔在他的回答中提到的,你可能会发现Qt库的套接字部分很有用.有关参考,请参阅QTCpSocket,以及示例代码的fortune客户端.
此外,Boost.Asio已经出现在我的脑海中,但它可能会为您提供过多的抽象和低级细节.
你C socket
在freshmeat上搜索,你可能会找到一个比任何C++库都更适合的C库.
我只能找到有关基于 C 的套接字实现的参考/教程。是否有一个原因?
可能是因为所有的套接字实现都是基于原始的C语言berkeley套接字api,它定义了诸如recv、send、listen、accept、select等函数。
我强烈推荐您看看Boost ASIO。 它是一个跨平台 C++ API,因此您开发的任何代码都是可移植的。事实上,您会发现许多其他 Boost 库对您有用,并且它们都是跨平台的。
参考基本API。您可以在Windows和Linux中使用原始的socket C函数。但请注意,在 Windows 下存在一些细微的差异。例如,您必须首先调用 WSAstartup 函数。
Beej 的网络编程指南是关于基本套接字编程的一个非常好的参考。
即使您使用的是 C++ api,我也建议您仔细阅读一下它,因为它可以让您了解正在发生的事情。
编辑:说实话我不再使用 Boost ASIO 了。我发现它慢得可怕。使用 LibEV 或类似的或自己开发。Boost ASIO 似乎没有在 Linux 上使用 epoll。
我用 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
这是我在博客上制作的教程:因为你被卡住了
归档时间: |
|
查看次数: |
33191 次 |
最近记录: |