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); }
//////////////////////////////////////////////////////////////////////////////// /// 名 称: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; }
//////////////////////////////////////////////////////////////////////////////// /// 名 称: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; }