ClientAcceptor::ClientAcceptor()
{

	SocketFd = socket(AF_INET,SOCK_STREAM,0);
	if(SocketFd < 0)
	{
		cerr<<"obtain socketfd error"<<endl;
		return ;
	}

	addr.sin_family = AF_INET;
	addr.sin_port = htons(SERVER_PORT);
	addr.sin_addr.s_addr = htonl(INADDR_ANY);

	int ret = bind(SocketFd,(struct sockaddr*)&addr,sizeof(addr));
	if(ret < 0)
	{
		cerr<<"bind port and address error"<<endl;
		return ;
	}

	ret = listen(SocketFd,10);
	assert(ret >= 0);

	epoll_event events[MAX_EVENT_NUMBER];
	int epollfd = epoll_create(5);
	assert(epollfd != -1);

	Addfd(epollfd,SocketFd,false);

	Epoll_Register(epollfd,events);
}
Example #2
0
////////////////////////////////////////////////////////////////////////////////
/// 名   称:TCPSocket::CreateEpoll
/// 功   能:创建Epoll对象
/// 参   数:void
/// 返回 值:bool                       private
////////////////////////////////////////////////////////////////////////////////
bool TCPSocket::CreateEpoll()
{
    m_fdEpoll = epoll_create(5);
    if (m_fdEpoll < 0)
    {
        LOG("Create Epoll is Error.\n");
        return false;
    }
    Addfd(&m_addr, (map<int, CSocketClient*>*)&m_mapBuffer, m_fdEpoll, m_fdListen);
    return true;
}
/***************ClientAcceptor********************/
int ClientAcceptor::Epoll_Register(const int &epollfd,epoll_event * events)
{
	while(1)
	{
		int ret = epoll_wait(epollfd,events,MAX_EVENT_NUMBER,-1);
		if(ret < 0)
		{
			cerr<<"epoll failure"<<endl;
			break;
		}

		for(int i=0; i<ret; i++)
		{
			int sockfd = events[i].data.fd;
			if(sockfd == SocketFd)
			{
				struct sockaddr_in cliaddr;
				socklen_t clilen = sizeof(cliaddr);

				int connfd = accept(SocketFd,(struct sockaddr*)&cliaddr,&clilen);
				Addfd(epollfd,connfd,true);
			}
			else if(events[i].events & EPOLLIN)
			{
				pthread_t pthread;
				struct fds fds_worker;
				
				fds_worker.epollfd = epollfd;
				fds_worker.sockfd = sockfd;

				pthread_create(&pthread,NULL,worker,(void *)&fds_worker);
			}
			else
			{
				cout<<"something else happened"<<endl; 
			}
		}
	}

	close(SocketFd);		//server shutdown
	return 0;
}
Example #4
0
////////////////////////////////////////////////////////////////////////////////
/// 名   称:TCPSocket::EpollELWork
/// 功   能:Epoll主要工作函数
/// 参   数:stuThreadParam* pStu                      传入函数的结构体指针
///         int number                                本次捕获事件数组个数
/// 返回 值:bool                       private
////////////////////////////////////////////////////////////////////////////////
bool TCPSocket::EpollELWork(stuThreadParam* pStu, int number)
{
    CSocketPacket* pPacket;
    char buf[SIZE_PACKET_MAX];

    // map容器:Key为客户sockfd,Data为Client对象指针
    map<int, CSocketClient*>* pMapBuffer = (map<int, CSocketClient*>*)pStu->pMapBuffer;
    // 捕获为Epoll事件数组
    epoll_event* events = pStu->pEvents;
    // epoll集合,用以增加、删除客户端
    int epollfd = *pStu->pfdEpoll;
    // 服务器Socket,用以判断新连接产生
    int listenfd = *pStu->pfdListen;
    // 线程池指针
    CThreadPoolManager* pMgrThreadPool = (CThreadPoolManager*)pStu->pMgrThreadPool;

    for (int i = 0; i < number; i++)
    {
        int sockfd = events[i].data.fd;

        if (sockfd == listenfd)
        {
            struct sockaddr_in client_address;
            socklen_t client_addresslen = sizeof(client_address);
            int connfd = accept(listenfd, (struct sockaddr*)&client_address, &client_addresslen);
            Addfd(&client_address, pMapBuffer, epollfd, connfd);
            LOG("Client is Come In...\n");

        }
        else if (events[i].events & EPOLLIN)
        {
            while (true)
            {
                memset(buf, 0x00, sizeof(buf));
                int ret = recv(sockfd, buf, SIZE_PACKET_MAX - 1, 0);

                if (ret < 0)
                {
                    if ((errno == EAGAIN) || (errno == EWOULDBLOCK))
                    {
                        //LOG("Recv Completed.\n");
                        break;
                    }
                    Delfd(pMapBuffer, epollfd, sockfd);
                    break;
                }
                else if (0 == ret)
                {
                    Delfd(pMapBuffer, epollfd, sockfd);
                    break;
                }
                else
                {
                    pPacket = new CSocketPacket;
                    // 放入环形缓冲区,然后再从环形缓冲区中弹出完整包
                    (*pMapBuffer)[sockfd]->GetBuffer()->PushByte(buf, ret);
                    while ((*pMapBuffer)[sockfd]->GetBuffer()->PopPacket(pPacket->setTotalData()))
                    {
                        if (pPacket->isChecked())
                        {
                            pPacket->setClient((*pMapBuffer)[sockfd]);
                            pMgrThreadPool->Run(MyProcFunc, (void*)pPacket);

                            pPacket = new CSocketPacket;
                        }
                        else
                        {
                            LOG("Pack is not Check.\n");
                        }
                    }
                    delete pPacket;
                }
            }
        }
        else
        {
            LOG("something else happen.\n");
        }
    }
    return true;
}