Exemple #1
0
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;
	}
}
Exemple #2
0
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;
}
Exemple #3
0
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));
	}
}
Exemple #4
0
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);
}