转:sock_ev——linux平台socket事件框架(基于字节流的测试程序) .
原文: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事件框架(基于字节流的测试程序) .的更多相关文章
- 转:sock_ev——linux平台socket事件框架(基于数据报的测试程序) .
上一篇已经做过注释,这一篇直接上代码 /******************************************************************************** ...
- 转:sock_ev——linux平台socket事件框架(socket API的封装) .
把linux平台提供的有关socket操作的API进行封装是有必要的:基于stream操作的流程与基于dgram操作的流程略有不同,分别放在两个类中,但两者又有很多相似的操作,因此写一个基类,让其继承 ...
- 转:sock_ev——linux平台socket事件框架(event loop) .
上一篇我们封装了三种事件监听方式,如果分别提供给客户端使用,有点不方便,也不利于统一管理:我们再封装一层EventLoop. /************************************ ...
- 转:sock_ev——linux平台socket事件框架(event dispatcher) .
最近比较忙,好久没更新了:今天我们看一下事件的监听方式,在linux下面事件的监听方式有三种select.poll.epoll,性能上面epoll最高,如果仅是最多监听十多个描述符,用啥无所谓,如果是 ...
- 转:sock_ev——linux平台socket事件框架(socket代理类) .
前面分析了对socket基本操作的封装,并按照数据的传送方式写了两个类,本篇将写一个代理类提供给库的使用者使用的类. /**************************************** ...
- 转:sock_ev——linux平台socket事件框架(uri地址的解析) .
在第一篇中,已经说明,传递的socket地址采取以下形式: [cpp] view plaincopyprint?stream://192.168.2.10:8080 dgram://192.168 ...
- 转:sock_ev——linux平台socket事件框架(logTrace) .
写代码要有调试log,采用syslog的输出:一般会输出到"/var/log/messages" /**************************************** ...
- AgileEAS.NET SOA 中间件平台.Net Socket通信框架-介绍
一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...
- 基于.NET平台常用的框架整理<转载>
转载来自:http://www.cnblogs.com/hgmyz/p/5313983.html 基于.NET平台常用的框架整理 自从学习.NET以来,优雅的编程风格,极度简单的可扩展性,足够强大 ...
随机推荐
- C++ -- STL泛型编程(一)之vector
STL提供三种组件:容器,迭代器,算法,它们都支持泛型程序设计标准容器有两类:顺序容器和关联容器. 顺序容器(vector,list,deque,string等)是一系列元素的有序组合. 关联容器(s ...
- mysql server has gone away的原因
之前遇到开发询问“mysql server has gone away”的问题,想当然的就认为是由于太长时间没有操作,导致超过MySQL服务端上的wait_timeout的设置,最终连接被MySQL服 ...
- vue获取当前v-for里当前点击元素
app.vue <template> <div id="app"> <ul > <li v-for="(item,index) ...
- OpenWrt防火墙配置(极路由)
说明: 1.极路由使用的是OpenWrt做为操作系统,本身就是一个Linux,包管理使用opkg,只是改了一个界面而已. 2.Linux下的防火墙最终都会归iptables进行管理,OpenWrt的防 ...
- ios开发中object-c中UTF-8 和 GBK 的 NSString 相互转化的方法
应用都要遇到一个很头疼的问题:文字编码,汉字的 GBK 和 国际通用的 UTF-8 的互相转化稍一不慎, 就会满屏乱码.下面介绍 UTF-8 和 GBK 的 NSString 相互转化的方法 NS ...
- The useful App Paths registry key : HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths how to load BPLs without writ ...
- Linux环境redis集群搭建
集群后tomcat context.xml的配置 <!-- 集群配置--> <Valve className="com.radiadesign.catalina.sessi ...
- linux基础命令行
1.ls ls //显示所有文件(不显示隐藏文件) ls -a //显示所有文件(显示隐藏文件) ls -l //显示所有文件详细信息 ls -S //以大小排序 ls -t //以时间排序 2.cd ...
- 简单的后台管理系统vue-cli3.0+element-ui
前段时间在研究一个分发系统,发现vue-cli+element-ui好像是挺不错的,然后自己根据那个分发系统尝试搭建了一下 1.首先安装vue和vue-cli // 全局安装vue npm insta ...
- tyvj 2075 借教室 题解
P2075 [NOIP2012T5]借教室 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 noip2012-tg 描述 在大学期间,经常需要租借教室.大到院 ...