项目作者: oocpp

项目描述 :
基于Reactor 模式的多线程现代化C++11网络库
高级语言: C++
项目地址: git://github.com/oocpp/net.git


net

个人毕设作品。。。。。。

目前初步完成。继续完善中。。。

net是一个基于Reactor 模式的现代化C++11网络库。

自带TCP协议的异步非阻塞式的服务器和客户端库。

实现上深度借鉴muduoevpp两个开源网络库。

性能上没太多测试,不过个人感觉性能还不错。。。

没啥第三方库依赖,只要支持c++11就行。。。

需要的linux版本没测试。。。有时间再说。。。

使用时,需要确保TcpClient和TcpServer的生命周期至少在EvnetLoop::run()函数退出之后结束

特性

现代版的C++11接口

非阻塞异步接口都是C++11的functional形式的回调仿函数

非阻塞纯异步多线程TCP服务器/客户端

单核环境支持

线程安全

线程安全的退出,重启

客户端断线自动重连

服务端可同时监听多个ip/port

ipv6支持

例子

Tcp Echo Server

  1. #include"TcpServer.h"
  2. #include"NetFwd.h"
  3. using namespace net;
  4. int main(int argc, char* argv[]) {
  5. InetAddress addr("127.0.0.1",55555);
  6. EventLoop loop;
  7. TcpServer server(&loop, addr, "TCPEchoServer", 3);
  8. server.set_message_cb([](const TCPConnPtr& conn, Buffer* msg) {
  9. conn->send(msg);
  10. });
  11. server.set_connection_cb([](const TCPConnPtr & conn) {
  12. if (conn->is_connected()) {
  13. LOG_INFO << "A new connection from " << conn->get_peer_addr().toIpPort();
  14. } else {
  15. LOG_INFO << "Lost the connection from " << conn->get_peer_addr().to_ip_port();
  16. }
  17. });
  18. server.run();
  19. loop.run();
  20. }

Tcp Echo Client

  1. #include <iostream>
  2. #include <unistd.h>
  3. #include "TcpClient.h"
  4. #include "NetFwd.h"
  5. #include "Socket.h"
  6. #include <string>
  7. using namespace std;
  8. using namespace net;
  9. int main() {
  10. EventLoop loop;
  11. TcpClient client(&loop,InetAddress("127.0.0.1", 55555),"ChatClient");
  12. client.set_message_cb([](const TCPConnPtr& conn, Buffer* msg) {
  13. LOG_INFO<<"receive:"<<msg->read_ptr();
  14. });
  15. Socket::setNonBlockAndCloseOnExec(STDIN_FILENO);
  16. impl::Event e{&loop,STDIN_FILENO};
  17. e.set_read_cb([&client]{
  18. string s;
  19. getline(cin,s);
  20. client.connection()->send(s);
  21. });
  22. client.set_connection_cb([&e](const TCPConnPtr& conn) {
  23. if(conn->is_connected())
  24. e.enable_read();
  25. else
  26. e.disable_all();
  27. });
  28. client.set_message_cb([&e](const TCPConnPtr& conn,Buffer*msg) {
  29. msg->append("\0",1);
  30. LOG_INFO<<"receive:"<<msg->read_ptr();
  31. msg->clear();
  32. });
  33. client.connect();
  34. loop.run();
  35. }