原文:http://blog.csdn.net/gdutliuyun827/article/details/8257186

由于工作与学习的需要,写了一个socket的事件处理框架,在公司写的已经使用了一段时间,下班后回家抽出时间又重写了一下,并进行了完善,起名为:sock_ev;

最近正在调试阶段,源代码暂且不提供,以防误人子弟,会尽快提供出来;先把最基本的测试程序贴上来,让感兴趣的同仁可以有个感性的认识,希望大家多加关注
 
支持以下功能:
1、三种事件监听方式:select、poll、epoll
2、对读、写事件进行监控
3、实现了inet域、unix域的通信
4、支持字节流、数据包两种方式
 
地址格式采取以下形式:
stream://192.168.2.10:8080
dgram://192.168.2.10:8080
stream://unix.domain.ipc
dgram://unix.domain.ipc

注:地址形式采取字符串的形式;stream与dgram分别表示收发数据时采用字节流与数据报的形式。在inet域进行数据传输时要指定ip地址与端口号,注意ip地址与端口号之间用“:”分割,我是用冒号区分的inet域还是unix域;在unix域传输数据时指定一个合法的路径(不要求路径真是存在,我会把它放在/proc下面)。对于inet域服务器端的ip地址支持“*”(i.e: stream://*:8888).

基于字节流的client端测试程序:
/***************************************************************************************
****************************************************************************************
* FILE        : client_test.h
* Description    :
*            
* Copyright (c) 2012 by Liu Yanyun(E-mail:liuyun827@foxmail.com). All Rights Reserved.
* Without permission, shall not be used for any commercial purpose
*
* History:
* Version        Name         Date            Description
   0.1        Liu Yanyun        2012/12/03        Initial Version

****************************************************************************************
****************************************************************************************/

#include "socket.h"
#include "log_trace.h"
#include "socket_addr.h"
#include "socket_base.h"
#include <iostream>

using namespace std;

int main()
{
  Socket *clt = Socket::create();//Socket类封装的socket相关的操作,创建一个Socket
  bool ret = clt->connect("stream://192.168.2.10:8080");//向服务器发起连接
  ret = ret;

char buf[100] = {0};
  clt->recv(buf, sizeof(buf));//发送数据到server端
  cout<<buf<<endl;

sprintf(buf, "%s", "hello too");
  clt->send(buf, strlen(buf));//接受server发送来的数据

sleep(20);

Socket::destroy(clt);//通讯结束销毁创建的Socket

return 0;
}

server端测试程序:

/***************************************************************************************
****************************************************************************************
* FILE        : server_test.cc
* Description    :
*            
* Copyright (c) 2012 by Liu Yanyun(E-mail:liuyun827@foxmail.com). All Rights Reserved.
* Without permission, shall not be used for any commercial purpose
*
* History:
* Version        Name         Date            Description
   0.1        Liu Yanyun        2012/12/03        Initial Version

****************************************************************************************
****************************************************************************************/

#include "socket.h"
#include "log_trace.h"
#include "socket_addr.h"
#include "socket_base.h"
#include "event_loop.h"
#include <iostream>

using namespace std;

//有可读事件发生(有数据发送过)调用的callback
void readCb(EventLoop *loop_, Socket *sock_, EventType evt_, void *arg_)
{
  char buf[100] = {0};
  int ret = sock_->recv(buf, sizeof(buf));
  if(0 == ret)
  {
    loop_->removeEvt(sock_, evRead);
    Socket::destroy(sock_);
    printf("the other is connection is closed,destroy it\n");
  }

printf("buf:%s;arg:%s\n", buf, (char*)arg_);
}

/*
接受新的连接请求的callback;loop_:所在的监听loop,sock_此处是server的Socket,evt_触发的事件,
arg_注册callback是传递的参数,类似于pthread_create()
*/
void acceptCb(EventLoop *loop_, Socket *sock_, EventType evt_, void *arg_)
{
  printf("accept callback trigger:%s\n", (char*)arg_);
  Socket *conn = Socket::create();
  sock_->accept(conn);//接受客户端的连接,
  char *test = "test arg sock read";
  loop_->addEvt(conn, readCb, evRead, test);

char buf[100] = {"hello"};
  conn->send(buf, strlen(buf));
}

int main()
{
  EventLoop loop;//EventLoop用于管理监听的事件,实现了select poll epoll
  loop.initialize(pollLoop);//此处使用poll方式; epollLoop:epoll; selectLoop:select

Socket *ser = Socket::create();
  bool ret = ser->open("stream://192.168.2.10:8080");//在这个地址打开监听端口,可以用;stream://*:8080

/*
   添加到事件监听框架中,采取使用callback的形式,下面注册的是read事件,最后的参数是当callback调用的时候回传递过去。
  */
  char *test = "test arg accept";
  loop.addEvt(ser, acceptCb, evRead, test);

loop.listen(3000);//此处是循环监听事件的,内部会调用select、poll或epoll;有事件触发,会调用注册的callback

Socket::destroy(ser);

return 0;
}
上面的例子是inet域的数据传输,假如换成unix域的只需要把"stream://192.168.2.10:8080"修改为:"stream://unixDomainTest"即可。

转:sock_ev——linux平台socket事件框架(基于字节流的测试程序) .的更多相关文章

  1. 转:sock_ev——linux平台socket事件框架(基于数据报的测试程序) .

    上一篇已经做过注释,这一篇直接上代码 /******************************************************************************** ...

  2. 转:sock_ev——linux平台socket事件框架(socket API的封装) .

    把linux平台提供的有关socket操作的API进行封装是有必要的:基于stream操作的流程与基于dgram操作的流程略有不同,分别放在两个类中,但两者又有很多相似的操作,因此写一个基类,让其继承 ...

  3. 转:sock_ev——linux平台socket事件框架(event loop) .

    上一篇我们封装了三种事件监听方式,如果分别提供给客户端使用,有点不方便,也不利于统一管理:我们再封装一层EventLoop. /************************************ ...

  4. 转:sock_ev——linux平台socket事件框架(event dispatcher) .

    最近比较忙,好久没更新了:今天我们看一下事件的监听方式,在linux下面事件的监听方式有三种select.poll.epoll,性能上面epoll最高,如果仅是最多监听十多个描述符,用啥无所谓,如果是 ...

  5. 转:sock_ev——linux平台socket事件框架(socket代理类) .

    前面分析了对socket基本操作的封装,并按照数据的传送方式写了两个类,本篇将写一个代理类提供给库的使用者使用的类. /**************************************** ...

  6. 转:sock_ev——linux平台socket事件框架(uri地址的解析) .

    在第一篇中,已经说明,传递的socket地址采取以下形式: [cpp] view plaincopyprint?stream://192.168.2.10:8080   dgram://192.168 ...

  7. 转:sock_ev——linux平台socket事件框架(logTrace) .

    写代码要有调试log,采用syslog的输出:一般会输出到"/var/log/messages" /**************************************** ...

  8. AgileEAS.NET SOA 中间件平台.Net Socket通信框架-介绍

    一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...

  9. 基于.NET平台常用的框架整理<转载>

    转载来自:http://www.cnblogs.com/hgmyz/p/5313983.html 基于.NET平台常用的框架整理   自从学习.NET以来,优雅的编程风格,极度简单的可扩展性,足够强大 ...

随机推荐

  1. 高斯消元法求解异或方程组: cojs.tk 539.//BZOJ 1770 牛棚的灯

    高斯消元求解异或方程组: 比较不错的一篇文章:http://blog.sina.com.cn/s/blog_51cea4040100g7hl.html cojs.tk  539. 牛棚的灯 ★★☆   ...

  2. HDU 5654 xiaoxin and his watermelon candy 离线树状数组 区间不同数的个数

    xiaoxin and his watermelon candy 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5654 Description Du ...

  3. JS 循环遍历json

    第一  看看json的格式 { "employees": [ { "firstName":"Bill" , "lastName&q ...

  4. Single transistor provides short-circuit protection

    In certain dc/dc-converter applications, on-chip, cycle-by-cycle current limit may be insufficient p ...

  5. ADC for programmable logic uses one capacitor

    Many electronic devices require user input for setting the application properties. Typical input dev ...

  6. TRF7970A IC Communication Interface

    General Introduction The communication interface to the reader can be configured in two ways: with a ...

  7. Android中MVC模型(复合模式)

    mvc是model,view,controller的缩写,mvc包括三个部分: 1.模型(model)对象:是应用程序的主体部分,全部的业务逻辑都应该写在该层. 2.视图(view)对象:是应用程序中 ...

  8. Fiddler2 抓取手机APP数据包

    原文:http://blog.goyiyo.com/archives/2044 下载安装运行后,查出运行机器的IP,手机连接同一网域内的WIFI,手机WIFI连接设置里的高级里,代理设置填写上Fidd ...

  9. 如何将Emmet(ZenCoding)安装到到Dreamweaver8?

    用过其他版本的Dreamweaver,还是习惯了Dreamweaver8,占用少,插件也容易安装,下面讲的是ZenCoding插件的安装方法,当然现在这个已经叫Emmet了. 安装方法: a.下载dw ...

  10. ASP.NET Core 1.0 基础之配置

    来源https://docs.asp.net/en/latest/fundamentals/configuration.html ASP.NET Core 1.0支持不同的配置选项.应用配置数据可以是 ...