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    1024
 
struct 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示例的更多相关文章

  1. php libevent 扩展使用示例

    <?php define()); define()); class epoll{ private static $socket; public static $connections; priv ...

  2. Linux下libevent安装与示例

    http://www.cnblogs.com/kunhu/p/3632225.html

  3. 示例的libevent的程序

    著作权归作者所有. 商业转载请联系作者获得授权,非商业转载请注明出处. 作者:auxten 链接:http://zhuanlan.zhihu.com/auxten/20315482 来源:知乎 /* ...

  4. libevent使用IOCP网络模型的示例

    这段时间抽空学习了一下强大的网络库libevent,其使用标准C语言编写,支持Windows.Linux.Mac等等主流操作系统,早期版本不支持Windows的IOCP,最新版本已经添加上了,在网上找 ...

  5. 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 ...

  6. libevent 定时器示例

    程序执行结果: 每隔2秒,触发一次定时器. (2)98行:evtimer_assign在event.h中定义如下: 再来看看event_assign函数: ev     要初始化的事件对象 base  ...

  7. libevent带负载均衡的多线程使用示例

    功能: 主线程根据负载工作线程负载均衡算法,每隔一秒钟向特定的工作线程发送一条字符串信息,工作线程简单的把字符串信息打开出来.   Makefile   eventtest : eventtest.c ...

  8. Libevent初探

    Libevent 是一个用C语言编写的.轻量级的开源高性能网络库,主要有以下几个亮点:事件驱动( event-driven),高性能;轻量级,专注于网络,不如 ACE 那么臃肿庞大:源代码相当精炼.易 ...

  9. 【转】libevent源码分析

    libevent源码分析 转自:http://www.cnblogs.com/hustcat/archive/2010/08/31/1814022.html 这两天没事,看了一下Memcached和l ...

随机推荐

  1. CODEVS 1036 商务旅行

    题目描述 Description 某首都城市的商人要经常到各城镇去做生意,他们按自己的路线去做,目的是为了更好的节约时间. 假设有N个城镇,首都编号为1,商人从首都出发,其他各城镇之间都有道路连接,任 ...

  2. Hot OS'15 summary

    My OS Ought to Know Me Better: In-app Behavioural Analytics as an OS Service   Earlence Fernandes, U ...

  3. VS2010之MFC串口通信的编写教程

    http://wenku.baidu.com/link?url=K1XPdj9Dcf2of_BsbIdbPeeZ452uJqiF-s773uQyMzV2cSaPRIq6RddQQH1zr1opqVBM ...

  4. [转]回答--python django学的很迷茫怎么办?

    作者:王一链接:http://www.zhihu.com/question/26235428/answer/36568428来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处 ...

  5. 深入了解Qt(二)之元对象系统(Meta-Object System)

    深入了解Qt主要内容来源于Inside Qt系列,本文做了部分删改,以便于理解.在此向原作者表示感谢! 在Qt Meta Object System-元对象系统这篇文章中,从底层实现的源码剖析了元对象 ...

  6. WP8_区分滑动和点击(在图片列表中)

    在windows phone中,对于一个页面中 有图片列表的,滑动的时候,很容易被误认为是点击了图片,而打开图片详细信息等,原意是滑动列表,由此对图片添加2个事件,来控制其点击行为(滑动的时候,基本不 ...

  7. Android应用源码安卓短信拦截木马项目源码

    温馨提示:本资源由源码天堂整理提供下载转载时请留下链接说明:http://code.662p.com/view/9174.html安卓短信拦截木马源码主要功能就是开机后台启动,拦截本机收到的短信并且转 ...

  8. 理解inode

    转载:阮一峰 http://www.ruanyifeng.com/blog/2011/12/inode.html 一.inode是什么? 理解inode,要从文件储存说起. 文件储存在硬盘上,硬盘的最 ...

  9. jquery的上传控件uploadly,每行都有一个这样的控件对id选择器的使用

    1.先看看预览图 这个是我的页面,其中如果我没点击添加一行的时候,会把本来有的数据进行循环出来,这个时候每个记录都必须有个上传图片的按钮,但是jquery的uploadly这个控件只是锁定id的,至少 ...

  10. C# Datetime类常用技巧

    C#类常用技巧 //今天DateTime.Now.Date.ToShortDateString();//昨天,也就是今天的日期减一DateTime.Now.AddDays(-1).ToShortDat ...