您的位置:首页 > 编程语言 > C语言/C++

C++实现epoll回射服务器

2016-09-14 22:39 330 查看
C++实现epoll回射服务器,下载地址

------------------------------------------------------------------------------------------------------------------------------------------

#include <iostream>

#include <string>

#include <sys/types.h>

#include <sys/socket.h>

#include <arpa/inet.h>

#include <sys/epoll.h>

#define MAXSIZE 1024

using namespace std;

class server

{

    private:

        int m_port;

        int m_sfd;

        struct sockaddr_in serveraddr;

        int epfd;

    public:

        server(int port = 9999);

        ~server();

        //启动

        void running();

};

/* -------------------------------------------*/

/**

 * @brief  running 

 */

/* -------------------------------------------*/

void server::running()

{

        struct epoll_event events[MAXSIZE];

        int nready = 0;

        while(1)

        {

                nready = epoll_wait(this->epfd,events,MAXSIZE,-1);

                if(nready > 0)

                {

                    int i;

                    for(i = 0;i<nready;i++)

                    {

                        int tmpfd = events[i].data.fd;

                        if(tmpfd == m_sfd)//监听

                        {

                            struct sockaddr_in clientaddr;

                            socklen_t c_len = sizeof(clientaddr); 

                            int cfd = accept(tmpfd,(struct sockaddr*)&clientaddr,&c_len);

                            struct epoll_event event;

                            event.events = EPOLLIN;

                            event.data.fd = cfd;

                            //join tree

                            epoll_ctl(this->epfd,EPOLL_CTL_ADD,cfd,&event);

                        }

                        else

                        {   

                            char buf[1024] = {0};

                            int len = read(tmpfd,buf,sizeof(buf)); 

                            if(0 >= len)

                            {

                                epoll_ctl(this->epfd,EPOLL_CTL_DEL,tmpfd,NULL);

                                shutdown(tmpfd,SHUT_RDWR);

                            }

                            write(tmpfd,buf,len);

                        }

                    }

                }

        }

}

/* -------------------------------------------*/

/**

 * @brief  init socket

 *

 * @param port

 */

/* -------------------------------------------*/

server::server(int port):m_port(port),m_sfd(-1)

{

        //创建套接字

        m_sfd = socket(AF_INET,SOCK_STREAM,0);

        int ret = 0;

        if(-1 == m_sfd)

        {

            throw "创建套接字\n";

        }

        //端口复用

        int opt = 1;

        setsockopt(m_sfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));

        serveraddr.sin_family = AF_INET;

        serveraddr.sin_port = htons(m_port);

        serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);

        //绑定

        ret = bind(m_sfd,(struct sockaddr*)&serveraddr,sizeof(serveraddr));

        if(-1 == ret)

        {

            throw "绑定失败\n";

        }

        //监听

        ret = listen(m_sfd,128);

        if(-1 == ret)

        {

            throw "监听失败";

        }

        //创建树根

        this->epfd = epoll_create(MAXSIZE);

        if(-1 == this->epfd)

        {

            throw "epoll_create is wrong";

        }

        struct epoll_event event;

        event.events = EPOLLIN;

        event.data.fd = m_sfd;

        //加入树中

        epoll_ctl(this->epfd,EPOLLIN,m_sfd,&event);

}

/* -------------------------------------------*/

/**

 * @brief  close socket

 */

/* -------------------------------------------*/

server::~server()

{

    //关闭

   shutdown(this->m_sfd, SHUT_RDWR);

}

int main(int argc, char *argv[])

{

    try

    {

        server *s = new server(8888);

        s->running();

        delete s;

    }

    catch(const char *str)

    {

        cout << str << endl;

    }

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: