利用Libev写一个简单的client和server程序
2015-11-08 23:09
495 查看
利用Libev写一个简单的client和server程序
common.h程序:
echo_client.cc:
echo_server.cc:
common.h程序:
#ifndef _COMMON_H_ #define _COMMON_H_ #include <unistd.h> #include <fcntl.h> #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h> #include <strings.h> #include <cstdlib> #include <cstdio> #include <cstddef> #include <string> namespace common{ #define D(exp,fmt,...) do { \ if(!(exp)){ \ fprintf(stderr,fmt,##__VA_ARGS__); \ abort(); \ } \ }while(0) static void setnonblock(int fd){ fcntl(fd,F_SETFL,fcntl(fd,F_GETFL) | O_NONBLOCK); } static void setreuseaddr(int fd){ int ok=1; setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&ok,sizeof(ok)); } static void setaddress(const char* ip,int port,struct sockaddr_in* addr){ bzero(addr,sizeof(*addr)); addr->sin_family=AF_INET; inet_pton(AF_INET,ip,&(addr->sin_addr)); addr->sin_port=htons(port); } static std::string address_to_string(struct sockaddr_in* addr){ char ip[128]; inet_ntop(AF_INET,&(addr->sin_addr),ip,sizeof(ip)); char port[32]; snprintf(port,sizeof(port),"%d",ntohs(addr->sin_port)); std::string r; r=r+"("+ip+":"+port+")"; return r; } static int new_tcp_server(int port){ int fd=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); D(fd>0,"socket failed(%m)\n"); setnonblock(fd); setreuseaddr(fd); sockaddr_in addr; setaddress("0.0.0.0",port,&addr); bind(fd,(struct sockaddr*)&addr,sizeof(addr)); listen(fd,64); // backlog = 64 return fd; } static int new_tcp_client(const char* ip,int port){ int fd=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); setnonblock(fd); sockaddr_in addr; setaddress(ip,port,&addr); connect(fd,(struct sockaddr*)(&addr),sizeof(addr)); return fd; } }; // namespace common #endif // _COMMON_H_
echo_client.cc:
#include "ev.h" #include "common.h" static void do_connected(struct ev_loop* reactor,ev_io* w,int events){ close(w->fd); ev_break(reactor,EVBREAK_ALL); } int main(){ struct ev_loop* reactor=ev_loop_new(EVFLAG_AUTO); int fd=common::new_tcp_client("127.0.0.1",34567); ev_io io; ev_io_init(&io,&do_connected,fd,EV_WRITE); ev_io_start(reactor,&io); ev_run(reactor,0); close(fd); ev_loop_destroy(reactor); return 0; }
echo_server.cc:
#include "ev.h" #include "common.h" static void do_accept(struct ev_loop* reactor,ev_io* w,int events){ struct sockaddr_in addr; socklen_t addr_size=sizeof(addr); int conn=accept(w->fd,(struct sockaddr*)&addr,&addr_size); std::string r=common::address_to_string(&addr); fprintf(stderr,"accept %s\n",r.c_str()); close(conn); } int main(){ struct ev_loop* reactor=ev_loop_new(EVFLAG_AUTO); int fd=common::new_tcp_server(34567); ev_io w; ev_io_init(&w,do_accept,fd,EV_READ); ev_io_start(reactor,&w); ev_run(reactor,0); close(fd); ev_loop_destroy(reactor); }
相关文章推荐
- View的圆角边框简单实现
- Objective-C语法之KVC使用
- 哎呀,发现自己不会用模块的方式用kprobe啊,弱爆了
- Android 微光闪烁效果之更强Shimmer-android
- 黑马程序员——集合——Collection、List、set、Map
- ubuntu 下python编程 安装vtk模块
- eclipse export runnable jar(导出可执行jar包)
- Hive 表连接
- FPGA研发之道(14)写在coding之前的铁律
- 华为HG8245C光猫设置VOIP
- 硅谷机器人改变世界
- solr.in.action-ch06
- mybatis基础 (上手笔记1)
- Java 字符串等知识详解
- BFS
- Linux学习之软件管理
- vector中不能存放引用类型!!!!!!!!
- iOS 单例模式的介绍和写法
- FPGA研发之道(13)-设计不是凑波形(三)RAM
- C# List 的一些操作 (两List元素是否想同,List是否包含在另一个List中)