- 论坛徽章:
- 0
|
- int CMsgServer::Run()
- {
- // 清空读fdset
- FD_ZERO(&m_ReadSet);
- // 获取当前的时间
- m_nCurrTime = time(NULL);
- // 查询超时的fd
- CheckTimeoutFd();
- // 轮询fdset
- if (0 != Poll())
- {
- return -1;
- }
- // 处理fdset
- ProcessFdSet();
-
- return 0;
- }
- void CMsgServer::CheckTimeoutFd()
- {
- int nFd;
- m_nMaxFd = m_nListenFd;
- for (m_Iter1 = m_listCon.begin(), m_Iter2 = m_listCon.end(); m_Iter1 != m_Iter2;)
- {
- m_Iter3 = m_Iter1;
- nFd = m_Iter3->nFd;
- ++m_Iter1;
- if (m_nCurrTime - m_Iter3->nStartTime > m_nTimeOutSec)
- {
- // 删除超时连接
- close(nFd);
- m_listCon.erase(m_Iter3);
- }
- else
- {
- // 不超时的fd加入fdset中
- FD_SET(nFd, &m_ReadSet);
- if (nFd > m_nMaxFd)
- {
- m_nMaxFd = nFd;
- LogMsg("list size = %d, maxfd changed: %d", m_listCon.size(), m_nMaxFd);
- }
- }
- }
- }
- int CMsgServer::Poll()
- {
- int nFdNum, nEvent, nFd, nRet;
- // 将server listen fd加入fdset中
- FD_SET(m_nListenFd, &m_ReadSet);
- // 轮询fd集合
- while (true)
- {
- if (0 > (nFdNum = select(m_nMaxFd + 1, &m_ReadSet, NULL, NULL, NULL)))
- {
- if (EINTR == errno)
- {
- continue;
- }
- else
- {
- LogMsg("[%s] [%s] [%d]: select failed: %s, nListenFd = %d, nMaxFd = %d"
- , __FILE__, __FUNCTION__, __LINE__
- , strerror(errno)
- , m_nListenFd
- , m_nMaxFd);
- return -1;
- }
- }
- else
- {
- return 0;
- }
- }
- }
- void CMsgServer::ProcessFdSet()
- {
- int nFd;
- for (m_Iter1 = m_listCon.begin(), m_Iter2 = m_listCon.end(); m_Iter1 != m_Iter2;)
- {
- m_Iter3 = m_Iter1;
- ++m_Iter1;
- nFd = m_Iter3->nFd;
- if (FD_ISSET(nFd, &m_ReadSet))
- {
- // 处理fd
- ProcessFd(nFd);
- //
- LogMsg("ProcessFd");
- // 关闭fd
- close(nFd);
- // 处理完了之后删除fd
- m_listCon.erase(m_Iter3);
- }
- }
- // 如果还可以接收连接 检查监听socket是否可读
- if (m_listCon.size() < m_nMaxCon && FD_ISSET(m_nListenFd, &m_ReadSet))
- {
- Accept();
- }
- }
- int CMsgServer::Accept()
- {
- int nFd;
- //sock_addr tCntAddr;
- //socklen_t nCntAddrLen;
- //nCntAddrLen = sizeof(sock_addr);
- //if (-1 == (nFd = accept(m_nListenFd, (struct sockaddr*)&tCntAddr, &nCntAddrLen)))
- if (-1 == (nFd = accept(m_nListenFd, NULL, NULL)))
- {
- switch (errno) {
- case EAGAIN:
- #if EWOULDBLOCK != EAGAIN
- case EWOULDBLOCK:
- #endif
- case EINTR:
- case ECONNABORTED:
- break;
- default:
- LogMsg("[%s] [%s] [%d]accept failed: %s"
- , __FILE__, __FUNCTION__, __LINE__
- , strerror(errno));
- }
- return -1;
- }
- else
- {
- LogMsg("accept fd: %d", nFd);
- Connection tCon;
- tCon.nFd = nFd;
- tCon.nStartTime = time(NULL);
- m_listCon.push_back(tCon);
- //m_mapCon[nFd] = tCon;
- // 设置为非阻塞IO
- int nFdFl;
- if (-1 == (nFdFl = fcntl(nFd, F_GETFL, 0)))
- {
- LogMsg("[%s] [%s] [%d]: fcntl(...) error: %s\n"
- , __FILE__
- , __FUNCTION__
- , __LINE__
- , strerror(errno));
- return -1;
- }
- if (-1 == fcntl(nFd, F_SETFL, nFdFl | O_NONBLOCK))
- {
- LogMsg("[%s] [%s] [%d]: fcntl(...) error: %s\n"
- , __FILE__
- , __FUNCTION__
- , __LINE__
- , strerror(errno));
- return -1;
- }
- return 0;
- }
- }
- void CMsgServer::ProcessFd(int nFd)
- {
- LogMsg("ProcessFd");
- ssize_t nLen = recv(nFd, m_szRecvBuf, BUFF_SIZE, 0);
- if (0 < nLen)
- {
- m_szRecvBuf[nLen] = '\0';
- }
- else
- {
- LogMsg("[%s] [%s] [%d]recv failed: %s"
- , __FILE__, __FUNCTION__, __LINE__
- , strerror(errno));
- return;
- }
- LogMsg("recv = %s", m_szRecvBuf);
- int nRet = HandleRequest();
- send(nFd, "test", 4, 0);
- }
复制代码 |
|