Пример #1
0
void QListenerThread::ConnectAccept( bool bConnect )
{
    if ( bConnect ) {
        connect( pTcpServer, SIGNAL( Accept( qintptr ) ), this, SLOT( HandleAccept( qintptr ) ) );
    } else {
        disconnect( pTcpServer, SIGNAL( Accept( qintptr ) ), this, SLOT( HandleAccept( qintptr ) ) );
    }
}
Пример #2
0
void CUdpServer::HandleZeroBytes(CONNID dwConnID, TUdpBufferObj* pBufferObj)
{
	if(pBufferObj->operation == SO_RECEIVE)
	{
		if(dwConnID == 0)
			dwConnID = HandleAccept(pBufferObj);
		
		if(dwConnID != 0)
		{
			TUdpSocketObj* pSocketObj = FindSocketObj(dwConnID);

			if(TUdpSocketObj::IsValid(pSocketObj))
			{
				pSocketObj->detectFails = 0;
				DoSend(pSocketObj, nullptr, 0);
			}
			
			TRACE("<S-CNNID: %Iu> recv 0 bytes (detect package)\n", dwConnID);
		}

		DoReceive(pBufferObj);
	}
	else
	{
		ASSERT(dwConnID != 0);
		TRACE("<S-CNNID: %Iu> send 0 bytes (detect package)\n", dwConnID);
	}
}
Пример #3
0
void CTcpServer::HandleIo(CONNID dwConnID, TSocketObj* pSocketObj, TBufferObj* pBufferObj, DWORD dwBytes, DWORD dwErrorCode)
{
	ASSERT(pBufferObj != nullptr);
	ASSERT(pSocketObj != nullptr);

	if(dwErrorCode != NO_ERROR)
	{
		HandleError(dwConnID, pSocketObj, pBufferObj, dwErrorCode);
		return;
	}

	if(dwBytes == 0 && pBufferObj->operation != SO_ACCEPT)
	{
		AddFreeSocketObj(pSocketObj, SCF_CLOSE);
		AddFreeBufferObj(pBufferObj);
		return;
	}

	pBufferObj->buff.len = dwBytes;

	switch(pBufferObj->operation)
	{
	case SO_ACCEPT:
		HandleAccept((SOCKET)pSocketObj, pBufferObj);
		break;
	case SO_SEND:
		HandleSend(dwConnID, pSocketObj, pBufferObj);
		break;
	case SO_RECEIVE:
		HandleReceive(dwConnID, pSocketObj, pBufferObj);
		break;
	default:
		ASSERT(FALSE);
	}
}
Пример #4
0
void CUdpServer::HandleZeroBytes(CONNID dwConnID, TUdpBufferObj* pBufferObj)
{
	if(pBufferObj->operation == SO_RECEIVE)
	{
		if(dwConnID == 0)
			dwConnID = HandleAccept(pBufferObj);
		
		if(dwConnID != 0)
		{
			TRACE("<S-CNNID: %Iu> recv 0 bytes (detect package)\n", dwConnID);

			TUdpSocketObj* pSocketObj = FindSocketObj(dwConnID);

			if(TUdpSocketObj::IsValid(pSocketObj))
			{
				pSocketObj->detectFails = 0;
				SendDetectPackage(dwConnID, pSocketObj);
			}			
		}

		DoReceive(pBufferObj);
	}
	else
		VERIFY(FALSE);
}
Пример #5
0
    void TcpServer::RunServer()
    {
        this->Bind();
        this->Listen();
        listenChannel_->SetEvent(EVFILT_READ);
        listenChannel_->SetReadCb([this]{HandleAccept();});    
        listenChannel_->SetIsListen(true);
        loop_->AddChannel(listenChannel_);

    }
Пример #6
0
void CUdpServer::HandleReceive(CONNID dwConnID, TUdpBufferObj* pBufferObj)
{
	if(dwConnID == 0)
		dwConnID = HandleAccept(pBufferObj);

	if(dwConnID != 0)
	{
		if(FireReceive(dwConnID, (BYTE*)pBufferObj->buff.buf, pBufferObj->buff.len) == ISocketListener::HR_ERROR)
		{
			TRACE1("<S-CNNID: %Iu> OnReceive() event return 'HR_ERROR', connection will be closed !\n", dwConnID);
			AddFreeSocketObj(dwConnID, SCF_ERROR, SO_RECEIVE, ERROR_FUNCTION_FAILED);
		}
	}

	DoReceive(pBufferObj);
}
Пример #7
0
/**
 *@brief 主线程的loop
 */
int MainLoop()
{
    //epoll初始化
    g_iEpollFd = epoll_create(MAXEPOLLFDNUM);
    if(g_iEpollFd < 0)
    {
        LOG(LOG_ERROR, "epoll_create error ! strerr[%s]", strerror(errno));
        return -1;
    }

    //外网监听初始化
    if(Listen(g_iListenFd, g_sysParam.ip, g_sysParam.port))
    {
        LOG( LOG_ERROR, " Listen error, g_sysParam.ip[%s], g_sysParam.port[%d]", g_sysParam.ip, g_sysParam.port);
        return -1;
    }

    struct epoll_event events[MAXEVENTS];
    while(0 == g_bIsStop)
    {
        int nfds = epoll_wait(g_iEpollFd, events, MAXEVENTS, -1);
        if(nfds <= 0)     //错误处理
        {
            LOG(LOG_ERROR, "epoll_wait error!!! nfds[%d],errno[%d] \n", nfds, errno);
            continue;
        }

        for(int n = 0; n < nfds; n++)
        {
            if(events[n].data.fd == g_iListenFd)     //客户端新连接
            {
                LOG(LOG_DEBUG, "accept fd event! fd[%d]\n", events[n].data.fd);

                HandleAccept();
                continue;
            }
            else    //错误
            {
                LOG(LOG_ERROR, "unknow fd! fd[%d]\n", events[n].data.fd);
                continue;
            }

        }
    }

    return 0;
}
Пример #8
0
void CIocpServer::HandleIo(TSocketObj* pSocketObj, TBufferObj* pBufferObj, DWORD dwBytes, DWORD dwErrorCode)
{
	ASSERT(pBufferObj != NULL);
	ASSERT(pSocketObj != NULL);

	//判断是否已经标记失败
	if(dwErrorCode != NO_ERROR)
	{
		if(pBufferObj->operation != SO_ACCEPT)
		{
			FireError(pSocketObj->connID, pBufferObj->operation, dwErrorCode);
			AddFreeSocketObj(pSocketObj->connID);
		}
		else
		{
			DeleteAcceptSocket(pBufferObj->client, TRUE);
		}

		AddFreeBufferObj(pBufferObj);
		return;
	}

	if(dwBytes == 0 && pBufferObj->operation != SO_ACCEPT)
	{
		FireClose(pSocketObj->connID);
		AddFreeSocketObj(pSocketObj->connID);
		AddFreeBufferObj(pBufferObj);
		return;
	}

	pBufferObj->buff.len = dwBytes;

	switch(pBufferObj->operation)
	{
	case SO_ACCEPT:
		HandleAccept((SOCKET)pSocketObj, pBufferObj);
		break;
	case SO_SEND:
		HandleSend(pSocketObj, pBufferObj);
		break;
	case SO_RECEIVE:
		HandleReceive(pSocketObj, pBufferObj);
		break;
	default:
		ASSERT(FALSE);
	}
}
Пример #9
0
 void Route::Activate()
 {
     LOG_INFO(logs::app, "Activating route " << _rule->description);
     UniqueLock lock(_mutex);
     if (!_acceptor)
     {
         _acceptor = _rule->CreateAcceptor([this](const Acceptor::AcceptResult& res)
         {
             HandleAccept(res);
         });
         LOG_DEBUG(logs::app, "Route activated");
     }
     else
     {
         LOG_DEBUG(logs::app, "Route already active");
     }
 }
Пример #10
0
int TcpManager::RunProcess(int handleSocketCount)
{
    LOG_INFO  <<"TcpManager:: RunProcess start! thread id = "<<  this_thread::get_id();
    int ret = 0;

    epoll_event* event_buf =NULL;
    event_buf  = new epoll_event[handleSocketCount];
    if(event_buf == NULL)
    {
        return -1;
    }



    epoll_event listen_ev;
    listen_ev.data.fd  =m_listenSocket.m_socket;
    listen_ev.events=EPOLLIN;

    if(epoll_ctl(m_epoll,EPOLL_CTL_ADD,m_listenSocket.m_socket,&listen_ev) <0)
    {
        LOG_INFO<<"epoll_error";
        return ret = -1;
    }

    int event_count = 0;
    m_bRunning = true;
    while(m_bRunning)
    {
        event_count  =epoll_wait(m_epoll,event_buf,handleSocketCount, 500);
        if(event_count >0)
        {
            for(int i = 0 ; i<event_count ; i++)
            {
                if( event_buf[i].data.fd  == m_listenSocket.m_socket)
                {
                    HandleAccept();
                }
                else if(event_buf[i].events&EPOLLIN)
                {
                    HandleRead(event_buf[i].data.fd);
                }
                else if(event_buf[i].events&EPOLLOUT)
                {
                    HandleWrite(event_buf[i].data.fd);
                }
                else
                {
                    LOG_INFO<< "epoll wait ";
                    CloseSocket(event_buf[i].data.fd);
                    //错误或者对方关闭
                }
            }

        }
        else if(event_count == 0) //超时
        {

            //LOG_EVERY_N(INFO, 10) << "epoll timteout";
            //超时
        }
        else  //error
        {
            if(errno == EINTR){
                continue;
            }else
            {
                 LOG_INFO<< "epoll erorr errno="<<errno;
            }

        }
    }//while

    LOG_INFO  <<"TcpManager:: RunProcess end! thread id = "<<  this_thread::get_id();
    return 0;
}