赞
踩
几种网络库比较
react(同步)、proact(异步)模式
ACE下载地址:https://download.dre.vanderbilt.edu/
Github地址:https://github.com/DOCGroup/ACE_TAO
ACE书籍介绍
POSA:
面向模式的软件架构(卷1):模式系统
面向模式的软件架构(卷2):并发和联网对象模式
面向模式的软件架构(卷3):资源管理模式
面向模式的软件架构(卷4):分布式计算的模式语言
面向模式的软件架构(卷5):模式与模式语言
C++NP:
C++网络编程(卷1):运用ACE和模式消除复杂性
C++网络编程(卷2):基于ACE和框架的系统化复用
APG:(The ACE Programmers Guide)
ACE程序员指南:网络与系统编程的使用设计模式
上中下:
上篇:ACE技术论文集
中篇:ACE程序员教程
下篇:ACE应用实例
ACE网络编程 --ACE库入门:中篇-ACE程序员教程
初学者:ACE学习
ACE系列文章
ACE从入门到精通V9.5
.pro:
win32:ACE_ROOT = D:\ACE
win32:INCLUDEPATH += $$ACE_ROOT\include
win32:DEFINES += ACE_AS_STATIC_LIBS
win32:DEFINES += ACE_DOESNT_DEFINE_MAIN
win32:LIBS += $$ACE_ROOT\lib\libACE.a -lws2_32 -lmswsock -liphlpapi -lwsock32 -lnetapi32
#ifndef _SCK_SERVER_H #define _SCK_SERVER_H #include <ace/Init_ACE.h> class Sck_Server { public: Sck_Server() { ACE::init(); } ~Sck_Server() { ACE::fini(); } int start() const; void stop() const; }; #endif /* _SCK_SERVER_H */
由于添加了宏定义ACE_DOESNT_DEFINE_MAIN会出现"WSA Startup not initialized"的错误提示!而且服务器不能监听。
ACE定义了main这个宏,该宏会创建一个叫ACE_Main_Base对象来初始化网络,即调用WSAStartup函数。所以要避免这个问题,要么使用ACE定义的这个main宏作为程序入口,要么自己手动调用ACE_OS::socket_init或者WSAStartup初始化。
ACE如何融入QT中(解决定义ACE_DOESNT_DEFINE_MAIN后,无法开启TCP监听)
官网下载:https://libevent.org/ (若下不了,是因为上不了github)
服务器并发编程–libevent【bilibili】
libevent视频分散
Libevent实现简单TCP服务端及客户端
libevent多线程模式(memcached中)
libevent之bufferevent中获取客户端ip
#include "event.h"
struct event ev; //创建事件
//这里也可接一下返回值,struct event_base* event_init(void)中创建的base同时存到全局变量current_base
event_init(); //创建事件集合,
event_set(&ev, fd, EV_READ|EV_PRESIST, fifo_read, NULL);//绑定事件与fd,参数(事件,文件描述符,事件类型,回调函数,回调参数)
event_add(&ev,NULL); //将事件加入到集合(队列)中
event_dispatch(); //监听事件(类似消息循环),没有事件可监听则退出, 不加EV_PRESIST,则触发一次便清除
struct event ev;
struct event_base *base = event_base_new();
event_assign(&ev, base, SIGINT, EV_SIGNAL|EV_PERSIST, signal_handler, NULL);
event_add(&ev,NULL);
event_base_dispatch(base);
event_base_free(base);
event指针方式:
struct event *ev = NULL;
struct timeval tv;
ev = event_new(base, fd, EV_READ|EV_PERSIST, cb, NULL);
tv.tv_sec = 1;
tv.tv_usec = 0;
event_add(ev, &tv); //超时
struct event_base *base = NULL;
struct event_config *cfg = NULL;
cfg = event_config_new();
base = event_base_new_with_config(cfg);
event_base_free(base);
event_config_free(cfg);
#include <event.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <string.h> struct sockaddr_in server_addr; memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = 8000; server_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); struct event_base *base = event_base_new(); //参数(事件集合、监听回调函数(已accept了),回调参数,类型(释放监听对象时关闭socket|端口重复使用),监听队列长度,绑定地址信息) struct evconnlistener *listener = evconnlistener_new_bind(base, listener_cb, NULL, LEV_OPT_CLOSE_ON_FREE|LEV_OPT_REUSEABLE, 10, (struct sockaddr*)&server_addr, sizeof(server_addr)); event_base_dispatch(base); evconnlistener_free(listener); event_base_free(base);
监听回调:
void listener_cb(struct evconnlistener *listener, evutil_socket_t fd, struct sockaddr *addr, int socklen, void *arg)
{
printf("接受%d的连接\n", fd);
struct event_base *base = arg;
struct bufferevent *bev = bufferevent_socket_new(base, fd, BEV_OPT_CLOSE_ON_FREE); //参数(eventbase,fd,释放bufferevent则关闭连接)
//参数(bufferevent, 读回调,写回调, 其他回调,回调参数)
bufferevent_setcb(bev, read_cb, NULL, event_cb, &fd); //(void *)fd (void*)(&fd)
bufferevent_enable(bev, EV_READ);
}
读回调、其他回调:
void read_cb(struct bufferevent *bev, void *ctx) { int fd = *(int *)ctx; char buf[1024]={0}; size_t ret = bufferevent_read(bev, buf,sizeof(buf)); if(ret < 0) { printf("bufferevent_read error!\n"); } else { printf("read from %d: %s\n", fd, buf); } } void event_cb(struct bufferevent *bev, short what, void *ctx) { printf("异常发生: %x", what); int fd = *(int *)ctx; if(what & BEV_EVENT_EOF) { printf("客户端%d下线\n", *(int *)ctx); bufferevent_free(bev); //释放bufferevent关闭socket } else {} }
官网:https://think-async.com/Asio/
介绍:Boost.Asio网络编程
最重要的类:io_service ( io_context )
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。