客户端:

#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(五)使用例子的更多相关文章

  1. 6、netty第五个例子,使用websocket来通讯

    websocket中,可以支持双向的数据通信.其中所有的数据格式,都是以帧的形式来传递. initializer import io.netty.channel.ChannelInitializer; ...

  2. Libevent学习笔记(五) 根据例子学习bufferevent

    libevent中提供了一个Hello-world.c 的例子,从这个例子可以学习libevent是如何使用bufferevent的. 这个例子在Sample中 这个例子之前讲解过,这次主要看下buf ...

  3. libevent(五)event

    libevent使用struct event来表示一个事件. #define evutil_socket_t int #define ev_uint8_t unsigned char #define ...

  4. 五个小例子教你搞懂 JavaScript 作用域问题

    众所周知,JavaScript 的作用域和其他传统语言(类C)差别比较大,掌握并熟练运用JavaScript 的作用域知识,不仅有利于我们阅读理解别人的代码,也有助于我们编写自己的可靠代码. 下面笔者 ...

  5. 精通Web Analytics 2.0 (7) 第五章:荣耀之钥:度量成功

    精通Web Analytics 2.0 : 用户中心科学与在线统计艺术 第五章:荣耀之钥:度量成功 我们的分析师常常得不到我们应得的喜欢,尊重和资金,因为我们没有充分地衡量一个黄金概念:成果.因为我们 ...

  6. js去掉字符串前后空格的五种方法

    转载 :http://www.2cto.com/kf/201204/125943.html 第一种:循环检查替换[javascript]//供使用者调用  function trim(s){  ret ...

  7. 五种常见的ASP.NET应用程序安全缺陷

    下面给出了五个例子,阐述如何按照上述建议增强应用程序的安全性.这些例子示范了代码中可能出现的缺陷,以及它们带来的安全风险.如何改写最少的代码来有效地降低攻击风险.1 篡改参数◎ 使用ASP.NET域验 ...

  8. 五种常见的ASP.NET安全缺陷

    保证应用程序的安全应当从编写第一行代码的时候开始做起,原因很简单,随着应用规模的发展,修补安全漏洞所需的代价也随之快速增长.根据IBM的系统科学协会(SystemsSciencesInstitute) ...

  9. HTML实现页面自动跳转的五种方法

    下面列了五个例子来详细说明,这几个例子的主要功能是:在5秒后,自动跳转到同目录下的hello.html(根据自己需要自行修改)文件. 1)html的实现 复制代码 代码如下: <head> ...

随机推荐

  1. String 对象-->概念和创建

    1.String 对象 String 对象用于处理文本(字符串). String 对象创建方法: new String(). 语法: var txt = new String("string ...

  2. CentOS安装C函数库的man帮助

    安装linux可能没有安装C的man帮助, 像我安装时选择的是最小化安装就没有, 网上的大多是ubunu的安装方式,或者是C++的man帮助, 都不适合,那么CentOS安装C man手册的方法就是: ...

  3. Spring 中 用 ${xxx} 读取properties文件的说明

    properties 如果在 spring 中通过 PropertyPlaceholderConfigurer 加载,当spring 中需要 用到 properties 中的一些 key 和value ...

  4. ClickOnce的安装路径

    win 7下C:\Users\Administrator.U5G4L4PUY34SH5C\AppData\Local\Apps\2.0\KPVZOAYK.0JE\56B55RCH.A7A\winr.. ...

  5. G - Can you find it? 二分

    Give you three sequences of numbers A, B, C, then we give you a number X. Now you need to calculate ...

  6. 处理时间的类 —— System类、Date类 、SimpleDateFormat类 与 Calendar类

    在我们以往的编程中,就有过通过运行前和运行后时间差来判断时间复杂度的例子,再扯得远一点,我们在C语言中制造随机数的操作,也要用到有关时间的函数.而且,在我们未来的编程中,也会时不时要用到能够读取当前时 ...

  7. [YII2] Activeform表单部分组件使用方法

    文本框:textInput(); 密码框:passwordInput(); 单选框:radio(),radioList(); 复选框:checkbox(),checkboxList(); 下拉框:dr ...

  8. Java 多线程 --死锁及解决方案

    在java 多线程中 过多的同步造成相互不释放资源 从而相互等待,造成死锁线现象,一般发生于同步中持有多个对象锁 如以下代码: public class DeadLock { public stati ...

  9. 理解java容器底层原理--手动实现ArrayList

    为了照顾初学者,我分几分版本发出来 版本一:基础版本 实现对象创建.元素添加.重新toString() 方法 package com.xzlf.collection; /** * 自定义一个Array ...

  10. MacOs下安装Kong网关

    写在前面: 持续记录一下自己在解决api网关kong上的各种问题. 1.关于Kong网关 这是官网地址:https://konghq.com/ 2.通过brew安装postgres 因为kong的数据 ...