- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
libevent简单非阻塞异步程序示例
Libevent简介;;使用Libevent的基本流程;Libevent对事件的处理流程;Libevent buffer实现异步传输;;示例程序一:;//on_write函数中向客户端回写数据
void on_write(int sock, short event, void* arg)
{
char* buffer = (char*)arg;
send(sock, buffer, strlen(buffer), 0);
free(buffer);
}
//读事件
void on_read(int sock, short event, void* arg)
{
struct event* write_ev;
int size;
struct sock_ev* ev = (struct sock_ev*)arg;
ev-buffer = (char*)malloc(MEM_SIZE);
bzero(ev-buffer, MEM_SIZE);
size = recv(sock, ev-buffer, MEM_SIZE, 0);
printf(receive data:%s, size:%d\n, ev-buffer, size);
//当从socket读返回0标志对方已经关闭了连接,因此这个时候就没必要继续监听该套接口上的事件
if (size == 0) {
release_sock_event(ev);
close(sock);
return;
}
//传参给on_write 准备写时间
event_set(ev-write_ev, sock, EV_WRITE, on_write, ev-buffer);
event_base_set(base, ev-write_ev);
event_add(ev-write_ev, NULL);
}
;
void on_accept(int sock, short event, void* arg)
{
struct sockaddr_in cli_addr;
int newfd, sin_size;
struct sock_ev* ev = (struct sock_ev*)malloc(sizeof(struct sock_ev));
//之所以是在堆申请内存,是防止在栈分配而导致的访问未知内存而使得程序崩溃
ev-read_ev = (struct event*)malloc(sizeof(struct event));
ev-write_ev = (struct event*)malloc(sizeof(struct event));
sin_size = sizeof(struct sockaddr_in);
//创建新的套接字进行连接,sock是正在监听连接的套接字,而中间参数则是客户端的地址信息
newfd = accept(sock, (struct sockaddr*)cli_addr, sin_size);
//在newfd文件描述符上监听可读事件,如果有数据到达则调用on_read函数
event_set(ev-read_ev, newfd, EV_READ|EV_PERSIST, on_read, ev);
event_base_set(base, ev-read_ev);
event_add(ev-read_ev, NULL);
};
int main(int argc, char* argv[])
{
//创建一个套接字地址对象
struct sockaddr_in my_addr;
int sock;
//创建套接字描述符,实质是一个文件描述符
//AF_INET表示使用IP地址,SOCK_STREAM表示使用流式套接字
sock = socket(AF_INET, SOCK_STREAM, 0);
int yes = 1;
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, yes, sizeof(int));
memset(my_addr, 0, sizeof(my_addr));
//实例化对象的属性
my_addr.sin_family = AF_INET;//主机字节顺序
my_addr.sin_port = htons
文档评论(0)