Ejemplo n.º 1
0
bool xBlog::Run(const char *ip, uint16 port, uint32 timeout_secs, uint32 nthreads)
{
    int ret = -1;
    int skt = BindSocket(ip, port);

    if (skt < 0)
    {
        log_error("BindSocket %s %d error\r\n", ip, port);
        return false;
    }

#ifdef _WIN32

    HANDLE ths[128];

    for (uint32 i = 0; i < nthreads; i++)
    {
        struct event_base *base = event_base_new();
        if (base == NULL)
        {
            return false;
        }

        struct evhttp *httpd = evhttp_new(base);
        if (httpd == NULL)
        {
            return false;
        }

        ret = evhttp_accept_socket(httpd, skt);
        if (ret != 0)
        {
            return false;
        }

        SetRouteTable(httpd);

        ths[i] = CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE) xBlog::Dispatch, base, NULL, NULL);
        log_info("%d %d \r\n", i, ths[i]);
        if (ret != 0)
        {
            return false;
        }
    }

#else

    pthread_t ths[128];
    for (uint32 i = 0; i < nthreads; i++)
    {
        struct event_base *base = event_base_new();
        if (base == NULL)
        {
            return false;
        }

        struct evhttp *httpd = evhttp_new(base);
        if (httpd == NULL)
        {
            return false;
        }

        ret = evhttp_accept_socket(httpd, skt);
        if (ret != 0)
        {
            return false;
        }

        SetRouteTable(httpd);

        ret = pthread_create(&ths[i], NULL, xBlog::Dispatch, base);
        log_info("%d %d \r\n", i, ths[i]);
        if (ret != 0)
        {
            return false;
        }
            
    }

    /*
       for (int i = 0; i < nthreads; i++)
       { 
       pthread_join(ths[i], NULL); 
       }
     */

#endif

    return true;
}
Ejemplo n.º 2
0
int ConnMgr::Start()
{
	m_Lucky = -1;
	static int timeout = 0;
	//自动机
	int iStatus = -1;
	switch(m_status){
	case STA_CON:
		if(SUCCESS_RET == m_ProtocolHelper->Connect()){
			m_status = STA_CON_OK;
		}
		else{
			m_ProtocolHelper->CleanUp();
			m_status = STA_CON;
		}
		break;
	case STA_CON_OK:
		iStatus = m_ProtocolHelper->CheckCONReply();
		if(CHK_SUCCESS == iStatus){
			m_status = STA_MAC;
			timeout=-1;
		}
		else if(CHK_FAIL == iStatus || timeout > MAXTRY){
			m_ProtocolHelper->CleanUp();
			m_status = STA_CON;
			timeout=-1;
		}
		timeout++;
		break;
	case STA_MAC:
		iStatus = m_ProtocolHelper->SendMACAddress();
		if(SUCCESS_RET == iStatus){
			m_status = STA_MAC_OK;
		}
		else{
			m_ProtocolHelper->CleanUp();
			m_status = STA_CON;
		}
		break;
	case STA_MAC_OK:
		iStatus = m_ProtocolHelper->CheckMACReply();
		if(CHK_SUCCESS == iStatus){
			m_status = STA_NAT;
			timeout = -1;
		}
		else if(CHK_FAIL == iStatus || timeout > MAXTRY){
			if(CHK_FAIL == iStatus)
				AskForHelp(_T("你的MAC地址好像不对耶?"));
			else if( timeout > MAXTRY)
				AskForHelp(_T("连接超时了~"));
			m_ProtocolHelper->CleanUp();
			timeout = -1;
			m_status = STA_CON;
		}
		timeout++;
		break;
	case STA_NAT:
		iStatus = m_ProtocolHelper->SendNATVersion();
		if(SUCCESS_RET == iStatus){
			m_status = STA_NAT_OK;
		}
		else{
			m_ProtocolHelper->CleanUp();
			m_status = STA_CON;
		}
		break;
	case STA_NAT_OK:
		iStatus = m_ProtocolHelper->CheckNATReply();
		if(CHK_SUCCESS == iStatus){
			m_status = STA_INF;
			timeout = -1;
		}
		else if(CHK_FAIL == iStatus || timeout > MAXTRY){
			m_ProtocolHelper->CleanUp();
			m_status = STA_CON;
			timeout = -1;
		}
		timeout++;
		break;
	case STA_INF:
		iStatus = m_ProtocolHelper->SendInformation();
		if(SUCCESS_RET == iStatus){
			m_status = STA_INF_OK;
		}
		else{
			m_ProtocolHelper->CleanUp();
			m_status = STA_CON;
		}
		break;
	case STA_INF_OK:
		iStatus = m_ProtocolHelper->CheckINFReply();
		if(CHK_SUCCESS == iStatus){
			m_status = STA_CHK;
			timeout = -1;
		}
		else if(CHK_FAIL == iStatus || timeout > MAXTRY){
			if(CHK_FAIL == iStatus)
				AskForHelp(_T("看看你的用户名密码是不是写错了? 还有套餐选对没?"));
			else if( timeout > MAXTRY)
				AskForHelp(_T("连接超时了~"));
			m_ProtocolHelper->CleanUp();
			m_status = STA_CON;
			timeout = -1;
		}
		timeout++;
		break;
	case STA_CHK:
		iStatus = m_ProtocolHelper->SendCheckNAT();
		if(SUCCESS_RET == iStatus){
			m_status = STA_CHK_OK;
		}
		else{
			m_ProtocolHelper->CleanUp();
			m_status = STA_CON;
		}
		break;
	case STA_CHK_OK:
		iStatus = m_ProtocolHelper->CheckCHKReply();
		if(CHK_SUCCESS == iStatus){
			g_Status = ONLINE;
			onStatusChange();
			SetRouteTable();
			timeout = -1;
			m_status = STA_CON;
		}
		else if(CHK_FAIL == iStatus || timeout > MAXTRY){
			m_ProtocolHelper->CleanUp();
			timeout = -1;
			m_status = STA_CON;
		}
		timeout++;
		break;
	}
	return 0;
}