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> ...
随机推荐
- HTTP协议经典面试题整理及答案详解
无论你是Java.PHP开发者,还是运维人员,只要从事互联网行业,面试时都可能被问到HTTP协议相关知识.历时多天的呕心沥血,为你总结了HTTP协议的经典面试题.由于涉及内容比较繁杂不方便记忆,建议收 ...
- std::lock_guard和std::unique_lock的区别
std::lock_guard 1 初始化的时候锁定std::mutex std::mutex m_mtx; std::lock_guard<std::mutex> m_lock(m_mt ...
- 【three.js第七课】鼠标点击事件和键盘按键事件的使用
当我们使用鼠标操作three.js渲染出的对象时,不仅仅只是仅限用鼠标对场景的放大.缩小.旋转而已,还有鼠标左键.右键的点击以及键盘各种按键等等的事件.我们需要捕获这些事件,并在这些事件的方法里进行相 ...
- C - Sigma Function LightOJ - 1336 (数论)
一个让人脑洞大开的题. 题目大意比较简单,询问[1,n]有多少个数其因子和为偶数. 因子分解定理中求因子和的公式是 f(n)=(1+p1+p1^2+p1^3+...+p1^a1)(1+p2+p2^2+ ...
- C - Ekka Dokka
Ekka and his friend Dokka decided to buy a cake. They both love cakes and that's why they want to sh ...
- Windows DC域控由server08r2升级至server2016测试
测试环境 原DC: csctest.com CSCDC01 192.168.100.1 server08r2 CSCDC02 192.168.100.2 server08r2 要求: 原两台旧主机均更 ...
- python-Django收集主机信息json格式
Control: from django.conf.urls import patterns, include, url from django.contrib import admin admin. ...
- JS 获取浏览器
function getInfo() { var s = ""; s = " 网页可见区域宽:" document.body.clientWidth; s = ...
- php中垃圾回收机制
php中垃圾回收机制 我们可能在开发中经常会听到gc,是的gc就是垃圾回收容器,全称Garbage Collection. 此篇文章中“垃圾”的概念:如果一个变量容器能被减少到0,说明他就已经没有被引 ...
- Windows 计划任务 如果选择未登录就运行 则看不到GUI
You can specify that a task should run even if the account under which the task is scheduled to run ...