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; }
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; }