libevent(五)使用例子
客户端:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h> #include <event2/event.h>
#include <event2/event_struct.h>
#include <event2/buffer.h>
#include <event2/bufferevent.h> #define DEFAULT_HOST "127.0.0.1"
#define DEFAULT_PORT 8888
#define MAXLINE 1024 void cmd_msg_cb(int fd, short events, void *arg);
void socket_read_cb(struct bufferevent *bev, void *arg);
void event_cb(struct bufferevent *bev, short event, void *arg); int main(int argc, char **argv) {
char *host = DEFAULT_HOST;
int port = DEFAULT_PORT;
if (argc == ) {
port = atoi(argv[]);
} else if (argc == ){
host = argv[];
port = atoi(argv[]);
}
printf("host: %s, port: %d\n", host, port); 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 servaddr;
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(port);
inet_pton(AF_INET, host, &servaddr.sin_addr); bufferevent_socket_connect(bev, (struct sockaddr *)&servaddr, sizeof(servaddr)); bufferevent_setcb(bev, socket_read_cb, NULL, event_cb, ev_cmd);
bufferevent_enable(bev, EV_READ | EV_PERSIST); event_base_dispatch(base); return ;
} void cmd_msg_cb(int fd, short events, void *arg) {
char msg[MAXLINE];
int len = read(fd, msg, MAXLINE);
if (len <= ) {
perror("read error");
exit();
} struct bufferevent *bev = (struct bufferevent*)arg;
// 把终端的输入发送到服务器
bufferevent_write(bev, msg, len);
} void socket_read_cb(struct bufferevent *bev, void *arg) {
char msg[MAXLINE];
int len = bufferevent_read(bev, msg, MAXLINE);
msg[len] = '\0';
printf("msg from server: %s\n", msg);
} void event_cb(struct bufferevent *bev, short event, void *arg) {
if (event & BEV_EVENT_EOF) {
printf("server closed\n");
} else if (event & BEV_EVENT_ERROR) {
printf("unknown error\n");
} else if (event & BEV_EVENT_CONNECTED) {
printf("Connect to the server successfully\n");
return;
}
bufferevent_free(bev);
struct event *ev = (struct event*)arg;
event_free(ev);
}
服务器:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h> #include <event2/event.h>
#include <event2/event_struct.h>
#include <event2/buffer.h>
#include <event2/bufferevent.h>
#include <event2/bufferevent_struct.h>
#include <event2/listener.h> #define DEFAULT_PORT 8888 #define MAXLINE 1024
#define LISTENQ 10 void listener_cb(struct evconnlistener *listener, int fd, struct sockaddr *sock,
int socklen, void *arg);
void socket_read_cb(struct bufferevent *bev, void *arg);
void event_cb(struct bufferevent *bev, short event, void *arg); int main(int argc, char **argv) {
int port = DEFAULT_PORT;
if (argc == ) {
port = atoi(argv[]);
}
printf("http port: %d\n", port); //
struct sockaddr_in servaddr;
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(port); struct event_base *base = event_base_new(); evconnlistener *listener = evconnlistener_new_bind(base, listener_cb, base,
LEV_OPT_REUSEABLE | LEV_OPT_CLOSE_ON_FREE,
, (struct sockaddr*) &servaddr, sizeof(servaddr)); event_base_dispatch(base);
event_base_free(base); return ;
} void listener_cb(struct evconnlistener *listener, int fd, struct sockaddr *sock,
int socklen, void *arg) {
printf("accept a client: %d\n", fd); event_base *base = (struct event_base*)arg; struct bufferevent *bev = bufferevent_socket_new(base, fd, BEV_OPT_CLOSE_ON_FREE);
bufferevent_setcb(bev, socket_read_cb, NULL, event_cb, arg);
bufferevent_enable(bev, EV_READ | EV_PERSIST);
} void socket_read_cb(struct bufferevent *bev, void *arg) {
char msg[MAXLINE];
int len = bufferevent_read(bev, msg, MAXLINE);
msg[len] = '\0';
printf("msg from client %d: %s\n", bev->ev_read.ev_fd, msg);
char reply_msg[MAXLINE] = "server has got your msg";
bufferevent_write(bev, reply_msg, strlen(reply_msg));
} void event_cb(struct bufferevent *bev, short event, void *arg) {
if (event & BEV_EVENT_EOF) {
printf("client %d closed\n", bev->ev_read.ev_fd);
} else if (event & BEV_EVENT_ERROR) {
printf("unknown error\n");
}
bufferevent_free(bev);
}
libevent(五)使用例子的更多相关文章
- 6、netty第五个例子,使用websocket来通讯
websocket中,可以支持双向的数据通信.其中所有的数据格式,都是以帧的形式来传递. initializer import io.netty.channel.ChannelInitializer; ...
- Libevent学习笔记(五) 根据例子学习bufferevent
libevent中提供了一个Hello-world.c 的例子,从这个例子可以学习libevent是如何使用bufferevent的. 这个例子在Sample中 这个例子之前讲解过,这次主要看下buf ...
- libevent(五)event
libevent使用struct event来表示一个事件. #define evutil_socket_t int #define ev_uint8_t unsigned char #define ...
- 五个小例子教你搞懂 JavaScript 作用域问题
众所周知,JavaScript 的作用域和其他传统语言(类C)差别比较大,掌握并熟练运用JavaScript 的作用域知识,不仅有利于我们阅读理解别人的代码,也有助于我们编写自己的可靠代码. 下面笔者 ...
- 精通Web Analytics 2.0 (7) 第五章:荣耀之钥:度量成功
精通Web Analytics 2.0 : 用户中心科学与在线统计艺术 第五章:荣耀之钥:度量成功 我们的分析师常常得不到我们应得的喜欢,尊重和资金,因为我们没有充分地衡量一个黄金概念:成果.因为我们 ...
- js去掉字符串前后空格的五种方法
转载 :http://www.2cto.com/kf/201204/125943.html 第一种:循环检查替换[javascript]//供使用者调用 function trim(s){ ret ...
- 五种常见的ASP.NET应用程序安全缺陷
下面给出了五个例子,阐述如何按照上述建议增强应用程序的安全性.这些例子示范了代码中可能出现的缺陷,以及它们带来的安全风险.如何改写最少的代码来有效地降低攻击风险.1 篡改参数◎ 使用ASP.NET域验 ...
- 五种常见的ASP.NET安全缺陷
保证应用程序的安全应当从编写第一行代码的时候开始做起,原因很简单,随着应用规模的发展,修补安全漏洞所需的代价也随之快速增长.根据IBM的系统科学协会(SystemsSciencesInstitute) ...
- HTML实现页面自动跳转的五种方法
下面列了五个例子来详细说明,这几个例子的主要功能是:在5秒后,自动跳转到同目录下的hello.html(根据自己需要自行修改)文件. 1)html的实现 复制代码 代码如下: <head> ...
随机推荐
- 力软敏捷框架集成布局插件(ce-layout)
最近用力软的框架觉得框架在布局这块不是很友好特别是对像css不是很好的程序员来说,大部分大家都是后端程序员. 所以决定集成一个和力软敏捷框架风格比较一致的布局插件进来 插件ce-layout ,下载地 ...
- matplotlib IdentityTransform(原地变换)
2020-04-12 23:33:56 -- Edit by yangrayIdentityTransform继承于Affine2DBase类,它是一个高效实现原地变换的类.(不知道有什么用,变换前后 ...
- Python操作rabbitmq系列(四):根据类型订阅消息
在上一章中,所有的接收端获取的所有的消息.这一章,我们将讨论,一些消息,仍然发送给所有接收端.其中,某个接收端,只对其中某些消息感兴趣,它只想接收这一部分消息.如下图:C1,只对error感兴趣,C2 ...
- 自己实现一个 DFA 串模式识别器
自己实现一个 DFA 串模式识别器 前言 这是我编译原理课程的实验.希望读完这篇文章的人即便不知道 NFA,DFA 和正规表达式是什么,也能够对它们有一个简单的理解,并能自己去实现一个能够识别特定模式 ...
- 记录d3.js 力导向图的平移缩放,类似地图导航点击某一项移动到当前位置
项目中有用到d3.js用于图结构的查询, 需求如下: 右上角有个模糊搜索功能,查询出来的结果用列表展示 点击列表的某一列,要求画布移动到当前选中的节点的位置,基于画布正中间 搜索出来的结果列表展示用的 ...
- paddlehub Test on win10
conda 构建虚拟环境 1)虚拟环境下安装paddlepaddle 1.7 2)pip install paddlehub 3)添加环境变量hub_home,以免模型把c盘撑爆 4)下载的模型在.p ...
- file_put_contens小trick
file_put_contents tricks 0x01 trick1 来自于P神的实例: <?php $text = $_GET['text']; if(preg_match('[<& ...
- react: typescript jest && enzyme
Install Jest 1.install jest dependencies jest @types/jest ts-jest -D 2.jest.config.js module.exports ...
- orcale 多列转一行显示
强大的数据库有个自带函数wm_concat() wm_concat()这个函数放的是需要汇总的列 select wm_concat(name) name from tablename
- Java 多线程 -- 理解锁:手动实现可重入锁和不可重入锁
JDK提供的大多数内置锁都是可重入的,也就是 说,如果某个线程试图获取一个已经由它自己持有的锁时,那么这个请求会立 刻成功,并且会将这个锁的计数值加1,而当线程退出同步代码块时,计数器 将会递减,当计 ...