服务端

#include<netinet/in.h>
#include<stdio.h>
#include<string.h>
#include<event.h>
#include<event2/listener.h>
#include<event2/bufferevent.h>
#include<event2/thread.h> void listener_cb(struct evconnlistener *listener, evutil_socket_t fd, struct sockaddr *sock, int socklen, void *arg);
void socket_read_cb(struct bufferevent *bev, void *arg);
void socket_event_cb(struct bufferevent *bev, short events, void *arg); int main() {
//evthread_use_pthreads();//enable threads
struct sockaddr_in sin;
memset(&sin, , sizeof(struct sockaddr_in));
sin.sin_family = AF_INET;
sin.sin_port = htons(); struct event_base *base = event_base_new();
struct evconnlistener *listener = evconnlistener_new_bind(
base, listener_cb, base, LEV_OPT_REUSEABLE | LEV_OPT_CLOSE_ON_FREE, , (struct sockaddr *) &sin, sizeof(struct sockaddr_in));
event_base_dispatch(base);
evconnlistener_free(listener);
event_base_free(base);
return ;
} //一个新客户端连接上服务器了
//当此函数被调用时,libevent已经帮我们accept了这个客户端。该客户端的
//文件描述符为fd
void listener_cb(struct evconnlistener *listener, evutil_socket_t fd, struct sockaddr *sock, int socklen, void *arg) {
printf("accept a client %d\n", fd);
struct event_base *base = (struct event_base *) arg;
//为这个客户端分配一个bufferevent
struct bufferevent *bev = bufferevent_socket_new(base, fd, BEV_OPT_CLOSE_ON_FREE);
bufferevent_setcb(bev, socket_read_cb, NULL, socket_event_cb, NULL);
bufferevent_enable(bev, EV_READ | EV_PERSIST);
} void socket_read_cb(struct bufferevent *bev, void *arg) {
char msg[];
size_t len = bufferevent_read(bev, msg, sizeof(msg) - );
msg[len] = '\0';
printf("server read the data %s\n", msg);
char reply[] = "I has read your data";
bufferevent_write(bev, reply, strlen(reply));
} void socket_event_cb(struct bufferevent *bev, short events, void *arg) {
if (events & BEV_EVENT_EOF) {
printf("connection closed\n");
} else if (events & BEV_EVENT_ERROR) {
printf("some other error\n");
}
//这将自动close套接字和free读写缓冲区
bufferevent_free(bev);
}

客户端

#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<event.h>
#include<event2/bufferevent.h>
#include<event2/buffer.h>
#include<event2/util.h> int tcp_connect_server(const char *server_ip, int port);
void cmd_msg_cb(int fd, short events, void *arg);
void server_msg_cb(struct bufferevent *bev, void *arg);
void event_cb(struct bufferevent *bev, short event, void *arg); int main(int argc, char **argv) {
if (argc < ) {
//两个参数依次是服务器端的IP地址、端口号
printf("please input 2 parameter\n");
return -;
}
struct event_base *base = event_base_new();
struct bufferevent *bev = bufferevent_socket_new(base, -, BEV_OPT_CLOSE_ON_FREE); //监听终端输入事件
struct event *ev_cmd = event_new(
base, STDIN_FILENO, EV_READ | EV_PERSIST, cmd_msg_cb, (void *) bev); event_add(ev_cmd, NULL); struct sockaddr_in server_addr;
memset(&server_addr, , sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(atoi(argv[]));
inet_aton(argv[], &server_addr.sin_addr);
bufferevent_socket_connect(
bev, (struct sockaddr *) &server_addr, sizeof(server_addr));
bufferevent_setcb(bev, server_msg_cb, NULL, event_cb, (void *) ev_cmd);
bufferevent_enable(bev, EV_READ | EV_PERSIST);
event_base_dispatch(base);
printf("finished \n");
return ;
} void cmd_msg_cb(int fd, short events, void *arg) {
char msg[];
int ret = read(fd, msg, sizeof(msg));
if (ret < ) {
perror("read fail ");
exit();
}
struct bufferevent *bev = (struct bufferevent *) arg;
//把终端的消息发送给服务器端
bufferevent_write(bev, msg, ret);
} void server_msg_cb(struct bufferevent *bev, void *arg) {
char msg[];
size_t len = bufferevent_read(bev, msg, sizeof(msg));
msg[len] = '\0';
printf("recv %s from server\n", msg);
} void event_cb(struct bufferevent *bev, short event, void *arg) {
if (event & BEV_EVENT_EOF) {
printf("connection closed\n");
} else if (event & BEV_EVENT_ERROR) {
printf("some other error\n");
} else if (event & BEV_EVENT_CONNECTED) {
printf("the client has connected to server\n");
return;
}
//这将自动close套接字和free读写缓冲区
bufferevent_free(bev);
struct event *ev = (struct event *) arg;
event_free(ev);
}

Libevent例子(二)的更多相关文章

  1. libevent (二) 接收TCP连接

    libevent 接收TCP连接 Evconnlistener 机制为您提供了侦听和接受传入的 TCP 连接的方法.下面的函数全部包含在`<event2/listener.h>`中. ev ...

  2. PHP之高性能I/O框架:Libevent(二)

    Event扩展 Event可以认为是替代libevent最好的扩展,因为libevent已经很久不更新了,而Event一直在更新,而且Event支持更多特性,使用起来也比libevent简单. Eve ...

  3. scrapy-splash抓取动态数据例子二

    一.介绍 本例子用scrapy-splash抓取一点资讯网站给定关键字抓取咨询信息. 给定关键字:打通:融合:电视 抓取信息内如下: 1.资讯标题 2.资讯链接 3.资讯时间 4.资讯来源 二.网站信 ...

  4. Quartz1.8.5例子(二)

    /* * Copyright 2005 - 2009 Terracotta, Inc. * * Licensed under the Apache License, Version 2.0 (the ...

  5. Python例子二

    例1.构造函数 #-*-coding:utf--*- import sys class Student: def __init__(self,name,age): self.__name=name s ...

  6. go例子(二) 使用go语言实现数独游戏

    例子托管于github example.go package main import (     "./sudoku" ) func main() {     //var smap ...

  7. 从零开始学习Node.js例子二 文本提交与显示

    index.js var server = require("./server"); var router = require("./router"); var ...

  8. Flexigrid例子二: 原位编辑器

    有时候,我们想要编辑flexigrid里的数据.一个原位编辑器是需要的,现在不需要再弹出一个对话框了.这里我会展示如何做到这点. 我使用了jquery-in-place-editor库.请参考官方站点 ...

  9. C#解析XML 例子二

    <checkResult> <item> <fmId>XX0001</fmId> <fmItemId>20000RT</fmItemI ...

随机推荐

  1. usaco 洛谷 P2694 接金币 题解

    题目描述 在二维坐标系里,有N个金币,编号0至N-1.初始时,第i个金币的坐标是(Xi,Yi).所有的金币每秒向下垂直下降一个单位高度,例如有个金币当前坐标是(xf, yf),那么t秒后金币所在的位置 ...

  2. 【keytool jarsigner工具的使用】Android 使用JDK1.7的工具 进行APK文件的签名,以及keystore文件的使用

    一个android apk的编译过程 请参考: http://www.2cto.com/kf/201312/261475.html 典型的编译过程: aapt( Android Asset Packa ...

  3. swift3.0:sqlite3的使用

    介绍 一.sqlite是纯C语言中底层的数据库,在OC和Swift中都是经常使用的数据库,在开发中,可以使用代码创建数据库,可以使用图形化界面创建数据库.例如SQLiteManager.SQLiteS ...

  4. JS读取XML文件数据并以table显示数据(兼容IE火狐)

    先看xml文件: <?xml version="1.0" standalone="yes"?> <student> <stuinf ...

  5. Android 第三方加固方案 对比 MD

    常见的第三方加固方案官网介绍 由于安卓APP是基于Java的,所以极容易被破解,一个不经过加固的APP犹如裸奔一样,毫无防备.之前曾有新闻报道,一些专职的APP打包黑产就是专门从各种渠道找到apk,通 ...

  6. Java复习2-对象与类

    回顾基础知识过程中遇到的感觉需要记录一下的知识点. 封装 我们设计的class应当尽可能的高内聚,体现为封装的程度.一个class的属性应该只能自己修改,其他class都只是与本class沟通,而不应 ...

  7. Kafka:ZK+Kafka+Spark Streaming集群环境搭建(十四)定义一个avro schema使用comsumer发送avro字符流,producer接受avro字符流并解析

    参考<在Kafka中使用Avro编码消息:Consumer篇>.<在Kafka中使用Avro编码消息:Producter篇> 在了解如何avro发送到kafka,再从kafka ...

  8. Angular 2的12个经典面试问题汇总(文末附带Angular測试)

    Angular作为眼下最为流行的前端框架,受到了前端开发者的普遍欢迎.不论是初学Angular的新手.还是有一定Angular开发经验的开发者,了解本文中的12个经典面试问题,都将会是一个深入了解和学 ...

  9. JavaScript中一个对象如何继承另外一个对象

    如题,JavaScript中一个对象a如何继承另外一个对象b.即将b中的属性和方法复制到a中去. 面试中遇到了这个问题,当时脑子里的想法是: 1.除了循环遍历复制,还能怎样 2.javascript中 ...

  10. artTemplate子模板include

    art.Template:https://github.com/aui/art-template 下面来实现利用模版来实现递归调用生成tree <script type="text/h ...