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. phpinfo中查不到memcache信息问题

    已经安装了php的memcache扩展,可是怎么都不能通过phpinfo查询到,实际使用时提示扩展未安装.为什么呢?百般寻求解决方法,才发现主要有以下两点原因: 1.使用的php和安装扩展的php不是 ...

  2. BZOJ 1036 树的统计-树链剖分

    [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 12904 Solved: 5191[Submit][Status ...

  3. oracle 游标示例

    declare iCount int:=0; sPath nvarchar2(200); tdzsh nvarchar2(50);begin for x in (select c.imgpath fr ...

  4. Sql2008 php

    Sql2008支持php的擴展插件 http://www.microsoft.com/download/en/search.aspx?q=SQL+Server+for+PHP  全部 http://w ...

  5. 【MySQL】MySQL锁和隔离级别浅析一

    <MySQL技术内幕InnoDB存储引擎>第一版中对于MySQL的InnoDB引擎锁进行了部分说明,第二版有部分内容更新. 与MySQL自身MyISAM.MSSQL及其他平台BD锁的对比: ...

  6. (笔记)angular 包含关系的controller参数传递

  7. LiveView 0.8 RC1 could boot evidence files acquired from Win10 64bit

    The latest Windows 10 will be more and more popular in the very near future. Now let's take a look i ...

  8. 一、Struts2的概述

    一.Struts2概述 是什么? Struts2是一个M(模型---域--范围模型)V(View视图)C(控制器)框架(模型2).框架都是一个半成品.提高开发效率. Struts1是一个MVC框架,非 ...

  9. PUTTY使用Ctrl+s僵死的问题

    算是分享个小经验吧! 一直都是使用VM+PUTTY的方式调试Linux程序,有时候在Vi中编辑了程序,Windowns下旧习难改,顺手就Ctrl+s了,尽管我知道Vi的保存是:w. 很不幸这时的PUT ...

  10. 详说 Cookie, LocalStorage 与 SessionStorage

    本文最初发布于我的个人博客:咀嚼之味 最近在找暑期实习,其中百度.网易游戏.阿里的面试都问到一些关于HTML5的东西,问题大多是这样开头的:“你用过什么HTML5的技术呀?” 而后,每次都能扯到 Co ...