c++ 封装socket和epoll编程
2015-11-24 16:27
351 查看
编程实例:
CSocket.h文件请参考前一篇文章
CSocketEvent.h
TestSocketEvent.cpp
编译:
g++ -o TestSocketEvent TestSocketEvent.cpp CSocketEvent.h CSocket.h
CSocket.h文件请参考前一篇文章
CSocketEvent.h
#include <sys/epoll.h> #include <iostream> #include <cstdio> #include "CSocket.h" const int MaxEvents = 256; const int EpollSize = 500; class CSocketEvent { public: CSocketEvent(); virtual ~CSocketEvent(); bool eventSet(CSocket *socket, bool readable, bool writeable); bool eventAdd(CSocket *socket, bool readable, bool writeable); bool eventDel(CSocket *socket); int getEvents(int timeout); struct epoll_event events[MaxEvents]; private: int epfd; CSocketEvent(const CSocketEvent&); CSocketEvent& operator=(const CSocketEvent&); }; CSocketEvent::CSocketEvent() { if((epfd = epoll_create(EpollSize)) < 0) { std::cout << "create epoll handle err\n"; return; } memset(&events, 0, sizeof(struct epoll_event)*MaxEvents); } CSocketEvent::~CSocketEvent() { if(epfd > 0) { close(epfd); epfd = -1; } } bool CSocketEvent::eventSet(CSocket *socket, bool readable, bool writeable) { int sockfd = socket->getSockfd(); if(sockfd < 0) { std::cout << "eventSet the socket fd err\n"; return false; } struct epoll_event ev; memset(&ev, 0, sizeof(ev)); ev.events |= EPOLLET; //ET modle as default if(readable) ev.events |= EPOLLIN; if(writeable) ev.events |= EPOLLOUT; //ev.data.ptr = (void*)sockfd; return ( 0 == epoll_ctl(epfd, EPOLL_CTL_MOD, sockfd, &ev)); } bool CSocketEvent::eventAdd(CSocket *socket, bool readable, bool writeable) { int sockfd = -1; if(socket->setNonBlock(true)) sockfd = socket->getSockfd(); if(sockfd < 0) { std::cout << "eventAdd the socket fd err\n"; return false; } struct epoll_event ev; memset(&ev, 0, sizeof(ev)); ev.events |= EPOLLET; //ET modle as default if(readable) ev.events |= EPOLLIN; if(writeable) ev.events |= EPOLLOUT; //ev.data.ptr = sockfd; return ( 0 == epoll_ctl(epfd, EPOLL_CTL_ADD, sockfd, &ev)); } bool CSocketEvent::eventDel(CSocket *socket) { int sockfd = socket->getSockfd(); if(sockfd < 0) { std::cout << "eventDel the socket fd err\n"; return false; } struct epoll_event ev; memset(&ev, 0, sizeof(ev)); ev.events = 0; return (0==epoll_ctl(epfd, EPOLL_CTL_DEL, sockfd, &ev)); } int CSocketEvent::getEvents(int timeout) { int ret = epoll_wait(epfd, events, MaxEvents, timeout); return ret; }
TestSocketEvent.cpp
#include "CSocketEvent.h" int main(int argc, char *argv[]) { CServSocket servSocket; CSocketEvent socketEvent; char buf[256]; memset(buf,0, sizeof(buf)); if(!servSocket.Listen(9999)) { std::cout << "listen err\n"; } for(;;) { int ret = socketEvent.getEvents(1000); for(int i=0; i< ret; ++i) { if(socketEvent.events[i].data.fd == servSocket.getSockfd()) { CSocket *socket = NULL; if((socket = servSocket.Accept()) == NULL) { std::cout << "accpt error\n"; break; } socketEvent.eventAdd(socket, true, true); delete socket; } else if(socketEvent.events[i].events & EPOLLIN) { std::cout << "event trigger ...\n"; int sockfd = socketEvent.events[i].data.fd; CSocket *socket = new CSocket(); socket->setUp(sockfd, NULL); socket->Recv(buf, 10, 0); std::cout << buf << "\n"; socketEvent.eventSet(socket, true, true); delete socket; } } } return 0; }
编译:
g++ -o TestSocketEvent TestSocketEvent.cpp CSocketEvent.h CSocket.h
相关文章推荐
- C++ STL算法之accumulate函数
- c++数值算法
- 给VC++6.0加快捷注释和取消注释
- C++关键字
- 纸牌丰收之c++版本
- 回形遍历二维数组
- 顺序折线遍历二维数组
- c/c++ void 指针
- C++primer plus第六版课后编程练习答案3.3
- C++primer plus第六版课后编程练习答案3.2
- 【C++基础学习】类型声明
- 指针与多维数组(C++)
- C语言实现两栈空间共享
- C++primer plus第六版课后编程练习答案3.1
- 使用C++自定义Binder
- C++primer plus第六版课后编程练习答案2.6
- C++primer plus第六版课后编程练习答案2.4
- C++ - 隐式类类型转换
- C++primer plus第六版课后编程练习答案2.3
- qt下bezier曲线的绘制(C++)