void RMENet::HandleEvent(wxSocketEvent& evt) { NetworkConnection* connection = reinterpret_cast<NetworkConnection*>(evt.GetClientData()); switch(evt.GetSocketEvent()) { case wxSOCKET_LOST: // Connection was lost, either client disconnecting, or our socket breaking { // Generate event wxCommandEvent event(EVT_RMENET_CONNECTION_LOST); event.SetInt(0); event.SetString("GOOOFU"); event_dump->AddPendingEvent(event); } break; case wxSOCKET_OUTPUT: // We're ready to write to a socket { // Send waiting data connection->Send(); } break; case wxSOCKET_INPUT: // We got some data to be read. { NetworkMessage* nmsg = connection->Receive(); if(nmsg) { try { OnParsePacket(nmsg); FreeMessage(nmsg); } catch(std::runtime_error&) { FreeMessage(nmsg); Close(); } } } break; } }
static void *GB_Msg(void *data) { int ret; SYS_MSG sys_msg; SN_MSG *msg = NULL; pthread_detach(pthread_self()); if (GBMsgQueue < 0) return NULL; Log_pid(__FUNCTION__); while(1) { msg = SN_GetMessage(GBMsgQueue, MSG_GET_WAIT_ROREVER, &ret); if(ret == -1 || msg == NULL) { usleep(10); continue; } else { TRACE(SCI_TRACE_NORMAL,MOD_GB,"GB_Msg source:0x%x dest:0x%x msg_id:0x%x\n",msg->source,msg->dest,msg->msgId); pthread_mutex_lock(&gGBCfgLock); if(gGBCfg.enable != 1) // 未进入国标模式,直接释放消息 { FreeMessage(&msg); pthread_mutex_unlock(&gGBCfgLock); continue; } pthread_mutex_unlock(&gGBCfgLock); switch (msg->msgId) { default: { SN_MEMSET(&sys_msg, 0, sizeof(sys_msg)); sys_msg.mtype = 1; sys_msg.pmsg = msg; sendto(localmsg_writeSock, &sys_msg, sizeof(sys_msg), 0, NULL, 0); } break; } } } return NULL; }
void LiveServer::HandleEvent(wxSocketEvent& evt) { LivePeer* connection = reinterpret_cast<LivePeer*>(evt.GetClientData()); try { switch(evt.GetSocketEvent()) { case wxSOCKET_CONNECTION: // A client tries to connect! { wxSocketBase* client = serv->Accept(false); if(!client) { log->Message(wxT("Network error: Could not accept incoming connection.")); } LivePeer* connection = newd LivePeer(this, client); connection->parser = &LiveServer::OnParseLoginPackets; connecting_clients.push_back(connection); client->SetClientData(connection); client->SetEventHandler(*this, wxID_ANY); client->SetNotify(wxSOCKET_INPUT_FLAG | wxSOCKET_OUTPUT_FLAG | wxSOCKET_CONNECTION_FLAG | wxSOCKET_LOST_FLAG); client->Notify(true); } break; case wxSOCKET_LOST: // Connection was lost, either client disconnecting, or our socket breaking { if(connection->GetClientID() != 0) { client_mask &= ~(1 << connection->GetClientID()); editor->map.clearVisible(client_mask); } bool client = false; PeerList::iterator iter = connected_clients.begin(); while(iter != connected_clients.end()) { if(*iter == connection) { client = true; connected_clients.erase(iter); break; } else ++iter; } if(client) { // It was a client disconnecting. wxString str; str << wxT("Lost remote connection ") << connection->GetNick() << wxT(" (") << connection->GetHost() << wxT(")"); log->Message(str); log->UpdateClientList(connected_clients); delete connection; } else { // Our socket broke! log->Message(wxT("Network connection was interrupted. Can no longer continue to host.")); delete connection; Close(); } } break; case wxSOCKET_OUTPUT: // We're ready to write to a socket { //log->Message(wxT("Socket is writeable!")); if(connection) connection->Send(); } break; case wxSOCKET_INPUT: // We got some data to be read. { NetworkMessage* nmsg = connection->Receive(); if(nmsg) { ((this)->*(connection->parser))(connection, nmsg); FreeMessage(nmsg); } } break; } } catch(std::runtime_error& err) { connection->Close(); log->Message(wxT("Invalid packet received, the reported error was: ") + wxString(err.what(), wxConvUTF8)); } }
static void GB_MsgHandle(SN_MSG *msg, GB_CONNECT_STATE *gb_cons) { if (msg == NULL) return; switch (msg->msgId) { case MSG_ID_FWK_UPDATE_PARAM_IND: { stParamUpdateNotify *stNotify = (stParamUpdateNotify *)msg->para; switch(stNotify->prm_id) { case PRM_ID_GB_SIPD_CFG: { if(GB_Get_gGBConnStatus() == 0) { if(gb_cons->connfd > 0) { close(gb_cons->connfd); GB_ResetConState(gb_cons); } GB_Refresh_GBCfg(); } else if((gb_cons->cur_state == GB_STATE_RUNNING && gb_cons->bUnRegister == 1)// 正在注销 || (GB_Get_gGBConnStatus() == 2) // 离线 ) { if(gb_cons->connfd > 0) { close(gb_cons->connfd); GB_ResetConState(gb_cons); } GB_Set_gGBConnStatus(0); GB_Refresh_GBCfg(); } else { gb_cons->bUnRegister = 1; GB_sipd_register(gb_cons, 1); // 不带认证的注销请求 gb_cons->last_sendtime = get_cur_time()/1000; GB_Set_gGBConnStatus(0); } } break; case PRM_ID_GB_SIPD_DEVMODE_CFG: { } break; default: break; } } break; case MSG_ID_FWK_REBOOT_REQ: case MSG_ID_FWK_POWER_OFF_REQ: case MSG_IF_FWK_IPCHANGE_IND: { PRM_GB_SIPD_CFG gb_cfg; TRACE(SCI_TRACE_NORMAL,MOD_GB,"%s line=%d msg->msgId=%d\n",__FUNCTION__,__LINE__,msg->msgId); SN_MEMSET(&gb_cfg,0,sizeof(gb_cfg)); GB_Get_GBCfg(&gb_cfg); if(gb_cfg.enable != 1) { break; } if(GB_Get_gGBConnStatus() == 1) { gb_cons->bUnRegister = 1; GB_sipd_register(gb_cons, 1); // 不带认证的注销请求 gb_cons->last_sendtime = get_cur_time()/1000; } else { if(gb_cons->connfd > 0) { close(gb_cons->connfd); GB_ResetConState(gb_cons); } GB_Set_gGBConnStatus(0); } gb_ipchange = 1; gb_ipchange_time = get_cur_time()/1000; // 退出国标模式 } break; case MSG_ID_GB_GET_STATUS_REQ: { GB_GET_STATUS_RSP rsp; SN_MEMSET(&rsp,0,sizeof(rsp)); rsp.result = 0; rsp.status = GB_Get_gGBConnStatus(); SendMessageEx(msg->user, MOD_GB, msg->source, msg->xid, msg->thread, msg->msgId + 1, &rsp, sizeof(rsp)); } break; default: { } break; } FreeMessage(&msg); }