重明鸟软件知识平台
@网络编程:Epoll(2)
我们创建一个Epoll.cpp程序,负责接收客户端的信息,并回送给客户端。客户端可直接用上两节TCP中的客户端程序。

/*
在UBUNTU平台
codeblocks编译对过
*/
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/epoll.h>
#include <netdb.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
int m_ServerSocket;
int m_Port = 10001;
#define EPOLLSIZE 1000
int epfd=0;
int nfds=0;
struct epoll_event ev;
struct epoll_event events[EPOLLSIZE];
//设置句柄为非阻塞方式
bool Setnonblocking(int sockfd)
{
    if(fcntl(sockfd,F_SETFL,fcntl(sockfd,F_GETFD,0) | O_NONBLOCK) == -1)
        return false;
    return true;
}
  
bool StartEpollServer()
{
    epfd = epoll_create(EPOLLSIZE);
    m_ServerSocket = socket(AF_INET,SOCK_STREAM,0);
    if(m_ServerSocket==-1)
    {
        return false;
    }
  
    Setnonblocking(m_ServerSocket);
    ev.data.fd = m_ServerSocket;
    ev.events = EPOLLIN | EPOLLET;
    epoll_ctl(epfd,EPOLL_CTL_ADD,m_ServerSocket,&ev);
    struct sockaddr_in m_addr;
    m_addr.sin_family = AF_INET;
    m_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    m_addr.sin_port = htons(m_Port);
    int addr_len = sizeof(m_addr);
  
    if(-1 == bind(m_ServerSocket,(struct sockaddr*)&m_addr,addr_len))
    {
        close(m_ServerSocket);
        return false;
    }
  
    listen(m_ServerSocket,50);
    int n = 0;
    int connfd;
    int sockfd;
    int len=0;
    char buf[EPOLLSIZE];
    struct sockaddr_in clientaddr;
    while(true)
    {
        nfds = epoll_wait(epfd,events,20,500);
        for(n=0;n<nfds;n++)
        {
            if(events[n].data.fd == m_ServerSocket)
            {
                socklen_t client = sizeof(clientaddr);
                connfd = accept(m_ServerSocket,(struct sockaddr*)(&clientaddr),&client);
                if(connfd<0)
                {
                    printf("error accept!\n");
                    return 0;
                }
  
                Setnonblocking(connfd);
                printf("accept a connect ip:%s\n",inet_ntoa(clientaddr.sin_addr));
                ev.data.fd = connfd;
                ev.events = EPOLLIN | EPOLLET;
                epoll_ctl(epfd,EPOLL_CTL_ADD,connfd,&ev);
            }
            else if(events[n].events & EPOLLIN)//读信息
            {
                if( (sockfd = events[n].data.fd)<0)
                    continue;
  
                if( (len = read(sockfd,buf,EPOLLSIZE))<=0)
                {
                    close(sockfd);
                    events[n].data.fd = -1;
                    printf("read error");
                }
                else
                {
                    buf[len] = "";
                    printf("read:%s\n",buf);
                    ev.data.fd = sockfd;
                    ev.events = EPOLLOUT | EPOLLET;
                    epoll_ctl(epfd,EPOLL_CTL_MOD,sockfd,&ev);
                }
            }
            else if(events[n].events & EPOLLOUT)//发信息
            {
                sockfd = events[n].data.fd;
                write(sockfd,buf,len);
                ev.events = EPOLLIN | EPOLLET;
                epoll_ctl(epfd,EPOLL_CTL_MOD,sockfd,&ev);
            }
        }
    }
    return true;
}
  
//主程序
int main()
{
    StartEpollServer();
    return 0;
}

程序运行结果跟IOCP服务端一样,至于那个效率更高呢,大家就自己测试下吧。
@站内查找
@栏目文章
【基础教程】TKinter(5):Label控件
【基础教程】TKinter(4):Messagebox控件
【基础教程】TKinter(3):Button控件
【基础教程】TKinter(2):控件及其属性
【基础教程】TKinter(1):第一个tkinter程序
【基础教程】Python守护进程创建
【基础教程】PyGame(13):三维环境设置
【基础教程】C/C++指针函数和回调函数
【基础教程】C/C++多进程编程(3)
【基础教程】C/C++多进程编程(2)
【基础教程】C/C++多进程编程(1)
【基础教程】C/C++多线程编程(2)
【基础教程】C/C++多线程编程(1)
【基础教程】C/C++动态库编程
【基础教程】C/C++静态库编程
【基础教程】photoshop图片混合公式
【基础教程】PyGame(12):旋转和缩放
【基础教程】PyGame(11):Surface操作
【基础教程】网络编程:Epoll(2)
【基础教程】网络编程:Epoll(1)
【基础教程】网络编程:IOCP(3)
【基础教程】网络编程:IOCP(2)
【基础教程】网络编程:IOCP(1)
【基础教程】网络编程:UDP
【基础教程】网络编程:TCP
【基础教程】Ubuntu安装Hadoop(4)
【基础教程】Ubuntu安装Hadoop(3)
【基础教程】Ubuntu安装Hadoop(2)
【基础教程】Ubuntu安装Hadoop(1)
【基础教程】Hadoop技术原理
【基础教程】Hadoop基本命令
【基础教程】Hadoop是什么东西
【基础教程】排序算法介绍
【基础教程】PyGame(10):声音控制
【基础教程】PyGame(9):鼠标事件(2)
【基础教程】PyGame(8):鼠标事件(1)
【基础教程】PyGame(7):键盘事件(2)
【基础教程】PyGame(6):键盘事件(1)
【基础教程】PyGame(5):显示图片
【基础教程】PyGame(4):显示文字
【基础教程】PyGame(3):图元绘制
【基础教程】PyGame(2):游戏框架
【基础教程】PyGame(1):开发环境搭建
【基础教程】Python(10):类定义
【基础教程】Python(9):自定义模块
【基础教程】Python(8):输入输出控制
【基础教程】Python(7):函数定义
【基础教程】Python(6):中断语句
【基础教程】Python(5):判断语句
【基础教程】Python(4):循环语句
【基础教程】Python(3):变量与运算符
【基础教程】Python(2):Hello
【基础教程】Python(1):介绍与安装
Copyright @ 2011-2018 by szc  桂ICP备11003301号-1  桂公网安备45040302000027号  Email:szcsoft@qq.com