酒泉网站建设设计,外贸网站建设注意事项和建议,有没有专门做二手车网站,欧洲站vat激活day16-重构核心库、使用智能指针#xff08;3#xff09;
最后将使用这个库的方式进行展示。
1、客户端
在while ((o getopt(argc, argv, optstring)) ! -1)所有的操作都是获取参数的操作#xff0c;threads 、msgs 和wait 分别指线程数、消息长度以及等待时间。 创建一…day16-重构核心库、使用智能指针3
最后将使用这个库的方式进行展示。
1、客户端
在while ((o getopt(argc, argv, optstring)) ! -1)所有的操作都是获取参数的操作threads 、msgs 和wait 分别指线程数、消息长度以及等待时间。 创建一个长度为threads的线程池绑定任务这种方式常用于回调函数的绑定可以将某个函数与特定的参数值绑定形成一个新的函数对象方便在后续使用将任务不断加入线程池中进行处理。
int main(int argc, char *argv[]) {int threads 100;int msgs 100;int wait 0;int o -1;const char *optstring t:m:w:;while ((o getopt(argc, argv, optstring)) ! -1) {switch (o) {case t:threads std::stoi(optarg);break;case m:msgs std::stoi(optarg);break;case w:wait std::stoi(optarg);break;case ?:printf(error optopt: %c\n, optopt);printf(error opterr: %d\n, opterr);break;default:break;}}ThreadPool *poll new ThreadPool(threads);std::functionvoid() func std::bind(OneClient, msgs, wait);for (int i 0; i threads; i) {poll-Add(func);}delete poll;return 0;
}OneClient作为任务函数创建了一个socket作为客户端并与服务器进行连接将连接中的读/写缓存进行初始化并新建连接开始不断从内核进行写读。
void OneClient(int msgs, int wait) {Socket *sock new Socket();sock-Create();sock-Connect(127.0.0.1, 1234);Connection *conn new Connection(sock-fd(), nullptr);sleep(wait);int count 0;while (count msgs) {conn-set_send_buf(Im client!);conn-Write();if (conn-state() Connection::State::Closed) {conn-Close();break;}conn-Read();std::cout msg count count : conn-read_buf()-c_str() std::endl;}delete sock;delete conn;
}2、服务器
首先创建sever服务器在这个过程中完成了MainReactor、创建socket、绑定、监听、创建一个线程池并创建多个子 Reactor 等一系列动作。
当程序接收到SIGINT信号时即用户按下CtrlC键时会执行所注册的信号处理函数。在这个例子中信号处理函数的作用是释放服务器对象的内存、输出提示信息并正常退出程序。
设置连接发生时的回调函数以及接收数据的回调函数
int main() {TcpServer *server new TcpServer();Signal::signal(SIGINT, [] {delete server;std::cout \nServer exit! std::endl;exit(0);});server-onConnect([](Connection *conn) { std::cout New connection fd: conn-socket()-fd() std::endl; });server-onRecv([](Connection *conn) {std::cout Message from client conn-read_buf()-c_str() std::endl;conn-Send(conn-read_buf()-c_str());});server-Start();delete server;return 0;
}主Reactor在主线程中运行专门负责监听和分发新的连接请求从而实现了整个服务器的高效事件处理。 当服务器启动时 1、主Reactor开始监听新的连接请求。 2、每当有新的连接到达时主Reactor接受连接并将其分配给某个子Reactor。 3、子Reactor在自己的线程中运行不断地处理与该连接相关的读写事件。 4、由于所有的 Loop 方法都在独立的线程中运行因此它们可以并发地处理各自的事件而不会互相阻塞。 子Reactor处理的事件在线程池的线程中而主Reactor处理的事件在主线程中。各自会被EventLoop不断轮询直到停止。