libevent I/O示例
I/O示例使用一个windows平台上服务器/客户端的例子来演示。由于为了减少代码篇幅等各种由于本人懒而产生的原因,以下代码没有做错误处理以及有些小问题,但是我想应该不影响演示,大家多包涵。
服务器代码:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
#include <stdio.h> #define WIN32_LEAN_AND_MEAN #include <windows.h> #include <winsock2.h> #include "event.h"#include "event_struct.h"#include "evutil.h"#define PORT 4000#define IP_ADDRESS "172.16.80.101"#define MEM_SIZE 1024struct event_base* base;struct sock_ev { struct event* read_ev; struct event* write_ev; char* buffer;};void release_sock_event(struct sock_ev* ev){ event_del(ev->read_ev); free(ev->read_ev); free(ev->write_ev); free(ev->buffer); free(ev); return;}void on_write(int sock, short event, void* arg){ char* buffer = (char*)arg; send(sock, buffer, strlen(buffer), 0); printf("on_write\n"); free(buffer); return;}void on_read(int sock, short event, void* arg){ struct event* write_ev; int size; struct sock_ev* ev = (struct sock_ev*)arg; printf("on_read\n"); ev->buffer = (char*)malloc(MEM_SIZE); memset(ev->buffer, 0, MEM_SIZE); size = recv(sock, ev->buffer, MEM_SIZE, 0); printf("receive data:%s, size:%d\n", ev->buffer, size); if (size == 0) { release_sock_event(ev); close(sock); return; } event_assign(ev->write_ev, base, sock, EV_WRITE, on_write, ev->buffer); event_add(ev->write_ev, NULL); return;}void on_accept(int sock, short event, void* arg){ struct sockaddr_in cli_addr; int fd, sin_size; struct sock_ev* ev = (struct sock_ev*)malloc(sizeof(struct sock_ev)); printf("on_accept\n"); ev->read_ev = (struct event*)malloc(sizeof(struct event)); ev->write_ev = (struct event*)malloc(sizeof(struct event)); sin_size = sizeof(struct sockaddr_in); fd = accept(sock, (struct sockaddr*)&cli_addr, &sin_size); event_assign(ev->read_ev, base, fd, EV_READ|EV_PERSIST, on_read, ev); event_add(ev->read_ev, NULL); return;}int main(int argc, char* argv[]){ WSADATA ws; SOCKET srvSock; struct sockaddr_in sockAddr; struct event ev_listen; WSAStartup(MAKEWORD(2,2), &ws); srvSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); sockAddr.sin_family = AF_INET; sockAddr.sin_addr.s_addr = inet_addr(IP_ADDRESS); sockAddr.sin_port = htons(PORT); memset(sockAddr.sin_zero, 0, sizeof(sockAddr.sin_zero)); bind(srvSock, (struct sockaddr*)&sockAddr, sizeof(sockAddr)); listen(srvSock, 10); base = event_base_new(); event_assign(&ev_listen, base, srvSock, EV_READ|EV_PERSIST, on_accept, NULL); event_add(&ev_listen, NULL); event_base_dispatch(base); closesocket(srvSock); WSACleanup(); return 0;} |
|
|
|
客户端代码:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
#include "stdafx.h"#include <stdio.h>#define WIN32_LEAN_AND_MEAN #include <windows.h> #include <winsock2.h> #include "event.h"#include "event_struct.h"#include "evutil.h"#define PORT 4000#define IP_ADDRESS "172.16.80.101"int main(int argc, char* argv[]){ WSADATA ws; SOCKET cltSocket; struct sockaddr_in sockAddr; int Ret = 0; WSAStartup(MAKEWORD(2,2), &ws); cltSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); sockAddr.sin_family = AF_INET; sockAddr.sin_addr.s_addr = inet_addr(IP_ADDRESS); sockAddr.sin_port = htons(PORT); memset(sockAddr.sin_zero, 0, sizeof(sockAddr.sin_zero)); connect(cltSocket,(struct sockaddr*)&sockAddr, sizeof(sockAddr)); //send char SendBuffer[MAX_PATH] = "test"; Ret = send(cltSocket, SendBuffer, (int)strlen(SendBuffer), 0); printf("send size=%d.\n", Ret); //recv char recvBuf[50] = {0}; if( 0 > recv(cltSocket, recvBuf, 50, 0) ) { printf("recv fail.\n"); return 0; } printf("%s\n", recvBuf); while(1) { Sleep(1000); } closesocket(cltSocket); WSACleanup(); return 0;} |
服务器的功能主要是接收客户端发来的数据,并返回给客户端。
客户端的功能主要是连接服务器后向服务器发送数据,然后读取服务器发来的数据。
下面分下以下代码流程:
客户端就不分析了,都是老套路。
服务器端:
(1) 首先添加一个永久的读类型的事件,指定的文件描述符是我们监听的socket。当有客户端来connect,这个事件会触发,触发回调函数on_accept()。
(2) 在on_accept()中accept后,在新的文件描述符上添加一个永久的读事件,当文件操作符可读,调用on_read()读取。
(3) 在on_read()中为了将数据写会给客户端,添加了一个写事件,这次的写事件不是永久的,只会触发一次,因为我们只将读取到的数据回给客户端一次。当文件描述符可写,触发回调函数on_write()写入给客户端。
(4) On_write()写入数据。
libevent I/O示例的更多相关文章
- php libevent 扩展使用示例
<?php define()); define()); class epoll{ private static $socket; public static $connections; priv ...
- Linux下libevent安装与示例
http://www.cnblogs.com/kunhu/p/3632225.html
- 示例的libevent的程序
著作权归作者所有. 商业转载请联系作者获得授权,非商业转载请注明出处. 作者:auxten 链接:http://zhuanlan.zhihu.com/auxten/20315482 来源:知乎 /* ...
- libevent使用IOCP网络模型的示例
这段时间抽空学习了一下强大的网络库libevent,其使用标准C语言编写,支持Windows.Linux.Mac等等主流操作系统,早期版本不支持Windows的IOCP,最新版本已经添加上了,在网上找 ...
- libevent 信号示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...
- libevent 定时器示例
程序执行结果: 每隔2秒,触发一次定时器. (2)98行:evtimer_assign在event.h中定义如下: 再来看看event_assign函数: ev 要初始化的事件对象 base ...
- libevent带负载均衡的多线程使用示例
功能: 主线程根据负载工作线程负载均衡算法,每隔一秒钟向特定的工作线程发送一条字符串信息,工作线程简单的把字符串信息打开出来. Makefile eventtest : eventtest.c ...
- Libevent初探
Libevent 是一个用C语言编写的.轻量级的开源高性能网络库,主要有以下几个亮点:事件驱动( event-driven),高性能;轻量级,专注于网络,不如 ACE 那么臃肿庞大:源代码相当精炼.易 ...
- 【转】libevent源码分析
libevent源码分析 转自:http://www.cnblogs.com/hustcat/archive/2010/08/31/1814022.html 这两天没事,看了一下Memcached和l ...
随机推荐
- .net HttpClient类(System.Net.Http) c#并发使用测试、压测
.net HttpClient类(System.Net.Http) c#并发使用测试.压测
- mysql 常用sql操作语句
获取数据库里所有表 SELECT TABLE_NAME,TABLE_ROWS FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='数据库名' 获取表里 ...
- Sublime 3114 + 转换GBK方法
下载地址: http://files.cnblogs.com/files/wuyifu/Sublime_Text_Build_3114_x64_Setup.zip -– BEGIN LICENSE - ...
- 在XML序列化时去除默认命名空间xmlns:xsd和xmlns:xsi
摘 自: http://blog.csdn.net/fxhflower/article/details/7276820 可使用以下代码: //Create our own namespaces for ...
- Linux之文件系统的简单操作
df:列出文件系统整体硬盘使用量 将容量以易读方式显示: [root@zkero ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/s ...
- 手机连接wifi自动弹窗的原理及其实现方案
一.手机连上wifi后会自动弹窗的原理 生活中,有很多需要认证的路由器,手机连接wifi热点后会自动弹出一个网页,让用户输入账号和密码,比如星巴克,肯地基,麦当劳,甚至是火车站和机场的候车室.其实这是 ...
- 微软ASP.NET MVC 学习地址
微软ASP.NET MVC4.0学习地址:http://www.asp.net/mvc
- 【Winform】DataTable绑定到ComboBox
我们从数据库中查询出来的数据存放在Datatable中 1.DataTable绑定到ComboBox上 cmbRole.DataSource = datatable; cmbRole.DisplayM ...
- linux中的虚拟化网络模型及各种模型实现
第一种隔离模型: Guest1和Guest2都为虚拟机. 首先要了解在linux中的虚拟机的网卡都包含前半段和后半段,前半段在虚拟机上,后半段在宿主机上,这里以centos6为例,上图 eth0为Gu ...
- php分页代码实例
$result = "<div class=\"page-num\"><ul class=\"fn-clear\">" ...