linux epoll服务器

  • L0_940381
    了解作者
  • 7.4KB
    文件大小
  • rar
    文件格式
  • 0
    收藏次数
  • VIP专享
    资源类型
  • 0
    下载次数
  • 2022-04-22 03:28
    上传日期
linux 下用epoll写tcp服务器的完整例子,还有通用makefile的例子。是一个学习linux服务器编程的好例子。
ServerEpoll.rar
  • logtxt.h
    150B
  • TCPSocket.cpp
    965B
  • Server.cpp
    572B
  • Epoll.cpp
    1.5KB
  • UDPSocket.h
    172B
  • ISocket.cpp
    1.1KB
  • UDPSocket.cpp
    139B
  • Server.h
    359B
  • ISocket.h
    658B
  • Listen.cpp
    1.1KB
  • stdafx.h
    383B
  • Client.cpp
    304B
  • TCPSocket.h
    310B
  • stdafx.cpp
    298B
  • Makefile
    1.3KB
  • Epoll.h
    461B
  • Client.h
    222B
  • Listen.h
    321B
  • targetver.h
    765B
  • ServerEpoll.cpp
    280B
  • logtxt.cpp
    1.3KB
内容介绍
#include "stdafx.h" #include "Epoll.h" #include <unistd.h> CEpoll::CEpoll(void) { m_epollfd = -1; } CEpoll::~CEpoll(void) { } int CEpoll::Init() { Create(10000); return 0; } int CEpoll::Release() { if( -1 != m_epollfd ) { close(m_epollfd); } } int CEpoll::Create(int size) { return m_epollfd = epoll_create(size); } int CEpoll::Ctl( void* p, int op,int fd, int events) { struct epoll_event e; e.data.ptr = p; e.events = events; return epoll_ctl(m_epollfd, op, fd, &e); } void CEpoll::AddItem(CISocket* item) { m_waitList.push_back(item); Ctl((void*)item,EPOLL_CTL_ADD,item->GetFd(),EPOLLIN | EPOLLERR); } void CEpoll::EpollWait() { int timeout = 100; for(std::list<CISocket*>::iterator it = m_waitList.begin();it!= m_waitList.end();it++) { if( !(*it)->IsValid() || (*it)->NeedDel() ) { Ctl((void*)(*it),EPOLL_CTL_DEL,(*it)->GetFd(),(int)(*it)->GetNewEvent()); it = m_waitList.erase(it); continue; } (*it)->Work(); if((*it)->GetNewEvent() != (*it)->GetOldEvent()) { Ctl((void*)(*it),EPOLL_CTL_MOD,(*it)->GetFd(),(int)(*it)->GetNewEvent()); (*it)->SaveNewEvent(); } } int count = epoll_wait(m_epollfd, m_events, 10000, timeout); for(int i=0;i<count;i++) { char e = (char) m_events[i].events; CISocket* socket = (CISocket*) m_events[i].data.ptr; if( e & EPOLLIN | e & (char)16) { socket->Read(); } if( e & EPOLLOUT ) { socket->Write(); } if( e & EPOLLERR ) { socket->SetValid(false); } } }
评论
    相关推荐