bool CNetClient::OnGameStart(void* context, CFsmEvent* event) { ENSURE(event->GetType() == (uint)NMT_GAME_START); CNetClient* client = (CNetClient*)context; JSContext* cx = client->GetScriptInterface().GetContext(); JSAutoRequest rq(cx); // Find the player assigned to our GUID int player = -1; if (client->m_PlayerAssignments.find(client->m_GUID) != client->m_PlayerAssignments.end()) player = client->m_PlayerAssignments[client->m_GUID].m_PlayerID; client->m_ClientTurnManager = new CNetClientTurnManager( *client->m_Game->GetSimulation2(), *client, client->m_HostID, client->m_Game->GetReplayLogger()); client->m_Game->SetPlayerID(player); client->m_Game->StartGame(&client->m_GameAttributes, ""); JS::RootedValue msg(cx); client->GetScriptInterface().Eval("({'type':'start'})", &msg); client->PushGuiMessage(msg); return true; }
bool CNetClient::OnPlayerAssignment(void* context, CFsmEvent* event) { ENSURE(event->GetType() == (uint)NMT_PLAYER_ASSIGNMENT); CNetClient* client = (CNetClient*)context; CPlayerAssignmentMessage* message = (CPlayerAssignmentMessage*)event->GetParamRef(); // Unpack the message PlayerAssignmentMap newPlayerAssignments; for (size_t i = 0; i < message->m_Hosts.size(); ++i) { PlayerAssignment assignment; assignment.m_Enabled = true; assignment.m_Name = message->m_Hosts[i].m_Name; assignment.m_PlayerID = message->m_Hosts[i].m_PlayerID; assignment.m_Status = message->m_Hosts[i].m_Status; newPlayerAssignments[message->m_Hosts[i].m_GUID] = assignment; } client->m_PlayerAssignments.swap(newPlayerAssignments); client->PostPlayerAssignmentsToScript(); return true; }
int SendResponse(NETADDR *pAddr, NETADDR *pCheck) { static char aIpBan[sizeof(BANMASTER_IPBAN) + 32 + 256] = { 0 }; static char *pIpBanContent = aIpBan + sizeof(BANMASTER_IPBAN); if (!aIpBan[0]) mem_copy(aIpBan, BANMASTER_IPBAN, sizeof(BANMASTER_IPBAN)); static CNetChunk p; p.m_ClientID = -1; p.m_Address = *pAddr; p.m_Flags = NETSENDFLAG_CONNLESS; CBan* pBan = CheckBan(pCheck); if(pBan) { str_format(pIpBanContent, 32, "%d.%d.%d.%d", pCheck->ip[0], pCheck->ip[1], pCheck->ip[2], pCheck->ip[3]); char *pIpBanReason = pIpBanContent + (str_length(pIpBanContent) + 1); str_copy(pIpBanReason, pBan->m_aReason, 256); p.m_pData = aIpBan; p.m_DataSize = sizeof(BANMASTER_IPBAN) + str_length(pIpBanContent) + 1 + str_length(pIpBanReason) + 1; m_Net.Send(&p); return 1; } else { p.m_DataSize = sizeof(BANMASTER_IPOK); p.m_pData = BANMASTER_IPOK; m_Net.Send(&p); return 0; } }
int main(int argc, char **argv) // ignore_convention { NETADDR BindAddr; dbg_logger_stdout(); net_init(); mem_zero(&BindAddr, sizeof(BindAddr)); BindAddr.port = VERSIONSRV_PORT; g_NetOp.Open(BindAddr, 0); dbg_msg("versionsrv", "started"); while(1) { g_NetOp.Update(); // process packets CNetChunk Packet; while(g_NetOp.Recv(&Packet)) { if(Packet.m_DataSize == sizeof(VERSIONSRV_GETVERSION) && mem_comp(Packet.m_pData, VERSIONSRV_GETVERSION, sizeof(VERSIONSRV_GETVERSION)) == 0) { SendVer(&Packet.m_Address); } } // be nice to the CPU thread_sleep(1); } return 0; }
int main(int argc, char **argv) // ignore_convention { NETADDR BindAddr; dbg_logger_stdout(); net_init(); mem_zero(&BindAddr, sizeof(BindAddr)); BindAddr.type = NETTYPE_ALL; BindAddr.port = VERSIONSRV_PORT; if(!g_NetOp.Open(BindAddr, 0)) { dbg_msg("mastersrv", "couldn't start network"); return -1; } BuildPackets(); dbg_msg("versionsrv", "started"); while(1) { g_NetOp.Update(); // process packets CNetChunk Packet; while(g_NetOp.Recv(&Packet)) { if(Packet.m_DataSize == sizeof(VERSIONSRV_GETVERSION) && mem_comp(Packet.m_pData, VERSIONSRV_GETVERSION, sizeof(VERSIONSRV_GETVERSION)) == 0) { SendVer(&Packet.m_Address); } if(Packet.m_DataSize == sizeof(VERSIONSRV_GETMAPLIST) && mem_comp(Packet.m_pData, VERSIONSRV_GETMAPLIST, sizeof(VERSIONSRV_GETMAPLIST)) == 0) { CNetChunk p; p.m_ClientID = -1; p.m_Address = Packet.m_Address; p.m_Flags = NETSENDFLAG_CONNLESS; for(int i = 0; i < m_NumPackets; i++) { p.m_DataSize = m_aPackets[i].m_Size; p.m_pData = &m_aPackets[i].m_Data; g_NetOp.Send(&p); } } } // be nice to the CPU thread_sleep(1); } return 0; }
void LoginLayerUC::LinkedGameServer(const Server& server) { CNetClient *tcp = CNetClient::getShareInstance(); tcp->setAddress(server.server_host().c_str(), server.server_port(),true); if (!tcp->isConnected()&&!tcp->getIsCloseConn()) { tcp->connect(); } }
INT32 CNetClient::SocketEventCB(ISocketChannel* pChn, void* pCaller, enumNetEventType iEvent, void* pData, UINT32 iDataLen) { CNetClient* pCli; pCli = (CNetClient*)pCaller; if(NULL == pCli) { return -1; } return pCli->OnSocketEvent(pChn, iEvent, pData, iDataLen); }
void SendOk(NETADDR *pAddr) { CNetChunk p; p.m_ClientID = -1; p.m_Address = *pAddr; p.m_Flags = NETSENDFLAG_CONNLESS; p.m_DataSize = sizeof(SERVERBROWSE_FWOK); p.m_pData = SERVERBROWSE_FWOK; // send on both to be sure m_NetChecker.Send(&p); m_NetOp.Send(&p); }
//连接网关服务器,连接成功后,网关服务器会自动推送服务器列表的消息过来 void LoginLayerUC::LinkedServerListNet() { #if DIRECT_CONNECT_GAMESERVER directConnectGameServer(); return; #endif GateServer gateServer = LoginScene::getGateServer(); CNetClient *tcp = CNetClient::getShareInstance(); tcp->setAddress(gateServer.sHost.c_str(), gateServer.iPort,false); if (!tcp->isConnected()) { tcp->connect(); } }
CTcpConnection* CNetServer::ConnectNew(CTcpContext* pContext) { if (!pContext) return nullptr; CNetClient* pClient = m_mapClient.allocate(pContext); if (pClient) { pClient->initialize(); pClient->bindContext(pContext); } return pClient; }
bool CNetClient::OnHandshake(void* context, CFsmEvent* event) { ENSURE(event->GetType() == (uint)NMT_SERVER_HANDSHAKE); CNetClient* client = (CNetClient*)context; CCliHandshakeMessage handshake; handshake.m_MagicResponse = PS_PROTOCOL_MAGIC_RESPONSE; handshake.m_ProtocolVersion = PS_PROTOCOL_VERSION; handshake.m_SoftwareVersion = PS_PROTOCOL_VERSION; client->SendMessage(&handshake); return true; }
bool CNetClient::OnHandshakeResponse(void* context, CFsmEvent* event) { ENSURE(event->GetType() == (uint)NMT_SERVER_HANDSHAKE_RESPONSE); CNetClient* client = (CNetClient*)context; CAuthenticateMessage authenticate; authenticate.m_GUID = client->m_GUID; authenticate.m_Name = client->m_UserName; authenticate.m_Password = L""; // TODO client->SendMessage(&authenticate); return true; }
bool CNetClient::OnConnect(void* context, CFsmEvent* event) { ENSURE(event->GetType() == (uint)NMT_CONNECT_COMPLETE); CNetClient* client = (CNetClient*)context; JSContext* cx = client->GetScriptInterface().GetContext(); JSAutoRequest rq(cx); JS::RootedValue msg(cx); client->GetScriptInterface().Eval("({'type':'netstatus','status':'connected'})", &msg); client->PushGuiMessage(msg); return true; }
bool CNetClient::OnRejoined(void *context, CFsmEvent* event) { ENSURE(event->GetType() == (uint)NMT_REJOINED); CNetClient* client = (CNetClient*)context; JSContext* cx = client->GetScriptInterface().GetContext(); CRejoinedMessage* message = (CRejoinedMessage*)event->GetParamRef(); JS::RootedValue msg(cx); client->GetScriptInterface().Eval("({'type':'rejoined'})", &msg); client->GetScriptInterface().SetProperty(msg, "guid", std::string(message->m_GUID), false); client->PushGuiMessage(msg); return true; }
bool CNetClient::OnClientPerformance(void *context, CFsmEvent* event) { // Performance statistics for one or multiple clients ENSURE(event->GetType() == (uint)NMT_CLIENT_PERFORMANCE); CNetClient* client = (CNetClient*)context; JSContext* cx = client->GetScriptInterface().GetContext(); if (client->GetCurrState() == NCS_LOADING) return true; CClientPerformanceMessage* message = (CClientPerformanceMessage*)event->GetParamRef(); std::vector<CClientPerformanceMessage::S_m_Clients> &clients = message->m_Clients; // Display warnings for other clients with bad ping for (size_t i = 0; i < clients.size(); ++i) { if (clients[i].m_MeanRTT < DEFAULT_TURN_LENGTH_MP || clients[i].m_GUID == client->m_GUID) continue; JS::RootedValue msg(cx); client->GetScriptInterface().Eval("({ 'type':'netwarn', 'warntype': 'client-latency' })", &msg); client->GetScriptInterface().SetProperty(msg, "guid", clients[i].m_GUID); client->GetScriptInterface().SetProperty(msg, "meanRTT", clients[i].m_MeanRTT); client->PushGuiMessage(msg); } return true; }
bool CNetClient::OnLoadedGame(void* context, CFsmEvent* event) { ENSURE(event->GetType() == (uint)NMT_LOADED_GAME); CNetClient* client = (CNetClient*)context; JSContext* cx = client->GetScriptInterface().GetContext(); JSAutoRequest rq(cx); // All players have loaded the game - start running the turn manager // so that the game begins client->m_Game->SetTurnManager(client->m_ClientTurnManager); JS::RootedValue msg(cx); client->GetScriptInterface().Eval("({'type':'netstatus','status':'active'})", &msg); client->PushGuiMessage(msg); return true; }
void LoginLayerUC::selectServer( CCObject* pObj ) { PlayEffectSound(SFX_Button); CImageView* pImageView = (CImageView*)pObj; if(m_iSelectServerIndex != pImageView->getParent()->getTag()) { m_iSelectServerIndex = pImageView->getParent()->getTag(); CNetClient *tcp = CNetClient::getShareInstance(); if (tcp->isConnected()) { tcp->close(); } } updateSelectServer(); hideServerList(); }
void SendCheck(NETADDR *pAddr) { CNetChunk p; p.m_ClientID = -1; p.m_Address = *pAddr; p.m_Flags = NETSENDFLAG_CONNLESS; p.m_DataSize = sizeof(SERVERBROWSE_FWCHECK); p.m_pData = SERVERBROWSE_FWCHECK; m_NetChecker.Send(&p); }
void SendError(NETADDR *pAddr) { CNetChunk p; p.m_ClientID = -1; p.m_Address = *pAddr; p.m_Flags = NETSENDFLAG_CONNLESS; p.m_DataSize = sizeof(SERVERBROWSE_FWERROR); p.m_pData = SERVERBROWSE_FWERROR; m_NetOp.Send(&p); }
bool CNetClient::OnGameSetup(void* context, CFsmEvent* event) { ENSURE(event->GetType() == (uint)NMT_GAME_SETUP); CNetClient* client = (CNetClient*)context; JSContext* cx = client->GetScriptInterface().GetContext(); JSAutoRequest rq(cx); CGameSetupMessage* message = (CGameSetupMessage*)event->GetParamRef(); client->m_GameAttributes = message->m_Data; JS::RootedValue msg(cx); client->GetScriptInterface().Eval("({'type':'gamesetup'})", &msg); client->GetScriptInterface().SetProperty(msg, "data", message->m_Data, false); client->PushGuiMessage(msg); return true; }
DWORD CNetClient::ClientThread(LPVOID pParam){ CNetClient * pThis = (CNetClient *)pParam; BOOL bRet = TRUE; while (bRet) { //首先接收数据包的包头 VODHEADER header = { 0 }; bRet = pThis->RecvData( &header,sizeof(header)); //根据ID判断,应该执行何种操作 switch (header.dwCmd) { case VODNETCMD_LOGIN://处理登录 bRet = pThis->OnLogin(); break; case VODNETCMD_MEDIADATA://处理影片文件下载的 bRet = pThis->OnMediaData(); break; case VODNETCMD_TYPES://处理返回所有媒体类型 bRet=pThis->OnAllVideoTypes(); break; case VODNETCMD_GETVIDES://处理返回指定类型所有影片的 bRet=pThis->OnVideosByTypeID(); default: break; } } closesocket(pThis->m_hClientSocket); return 0; }
bool CNetClient::OnAuthenticate(void* context, CFsmEvent* event) { ENSURE(event->GetType() == (uint)NMT_AUTHENTICATE_RESULT); CNetClient* client = (CNetClient*)context; JSContext* cx = client->GetScriptInterface().GetContext(); JSAutoRequest rq(cx); CAuthenticateResultMessage* message = (CAuthenticateResultMessage*)event->GetParamRef(); LOGMESSAGE("Net: Authentication result: host=%u, %s", message->m_HostID, utf8_from_wstring(message->m_Message)); bool isRejoining = (message->m_Code == ARC_OK_REJOINING); client->m_HostID = message->m_HostID; JS::RootedValue msg(cx); client->GetScriptInterface().Eval("({'type':'netstatus','status':'authenticated'})", &msg); client->GetScriptInterface().SetProperty(msg, "rejoining", isRejoining); client->PushGuiMessage(msg); return true; }
void SendVer(NETADDR *pAddr) { CNetChunk p; unsigned char aData[sizeof(VERSIONSRV_VERSION) + sizeof(GAME_RELEASE_VERSION)]; mem_copy(aData, VERSIONSRV_VERSION, sizeof(VERSIONSRV_VERSION)); mem_copy(aData + sizeof(VERSIONSRV_VERSION), GAME_RELEASE_VERSION, sizeof(GAME_RELEASE_VERSION)); p.m_ClientID = -1; p.m_Address = *pAddr; p.m_Flags = NETSENDFLAG_CONNLESS; p.m_pData = aData; p.m_DataSize = sizeof(aData); g_NetOp.Send(&p); }
void SendNews(NETADDR *pAddr) { CNetChunk p; unsigned char aData[NEWS_SIZE + sizeof(VERSIONSRV_NEWS)]; mem_copy(aData, VERSIONSRV_NEWS, sizeof(VERSIONSRV_NEWS)); mem_copy(aData + sizeof(VERSIONSRV_NEWS), m_aNews, NEWS_SIZE); p.m_ClientID = -1; p.m_Address = *pAddr; p.m_Flags = NETSENDFLAG_CONNLESS; p.m_pData = aData; p.m_DataSize = sizeof(aData); g_NetOp.Send(&p); }
// Packet: VERSIONSRV_DDNETLIST + char[4] Token + int16 comp_length + int16 plain_length + char[comp_length] void SendServerList(NETADDR *pAddr, const char *Token) { CNetChunk p; unsigned char aData[16384]; short WordCompLength = m_ServerListCompLength; short WordPlainLength = m_ServerListPlainLength; mem_copy(aData, VERSIONSRV_DDNETLIST, sizeof(VERSIONSRV_DDNETLIST)); mem_copy(aData + sizeof(VERSIONSRV_DDNETLIST), Token, 4); // send back token mem_copy(aData + sizeof(VERSIONSRV_DDNETLIST)+4, &WordCompLength, 2); // compressed length mem_copy(aData + sizeof(VERSIONSRV_DDNETLIST)+6, &WordPlainLength, 2); // plain length mem_copy(aData + sizeof(VERSIONSRV_DDNETLIST)+8, m_aServerList, m_ServerListCompLength); p.m_ClientID = -1; p.m_Address = *pAddr; p.m_Flags = NETSENDFLAG_CONNLESS; p.m_pData = aData; p.m_DataSize = sizeof(VERSIONSRV_DDNETLIST) + 4 + 2 + 2 + m_ServerListCompLength; g_NetOp.Send(&p); }
bool CNetClient::OnKicked(void *context, CFsmEvent* event) { ENSURE(event->GetType() == (uint)NMT_KICKED); CNetClient* client = (CNetClient*)context; JSContext* cx = client->GetScriptInterface().GetContext(); CKickedMessage* message = (CKickedMessage*)event->GetParamRef(); JS::RootedValue msg(cx); client->GetScriptInterface().Eval("({})", &msg); client->GetScriptInterface().SetProperty(msg, "username", message->m_Name); client->GetScriptInterface().SetProperty(msg, "type", message->m_Ban ? std::string("banned") : std::string("kicked")); client->PushGuiMessage(msg); return true; }
bool CNetClient::OnChat(void* context, CFsmEvent* event) { ENSURE(event->GetType() == (uint)NMT_CHAT); CNetClient* client = (CNetClient*)context; JSContext* cx = client->GetScriptInterface().GetContext(); JSAutoRequest rq(cx); CChatMessage* message = (CChatMessage*)event->GetParamRef(); JS::RootedValue msg(cx); client->GetScriptInterface().Eval("({'type':'chat'})", &msg); client->GetScriptInterface().SetProperty(msg, "guid", std::string(message->m_GUID), false); client->GetScriptInterface().SetProperty(msg, "text", std::wstring(message->m_Message), false); client->PushGuiMessage(msg); return true; }
bool CNetClient::OnClientTimeout(void *context, CFsmEvent* event) { // Report the timeout of some other client ENSURE(event->GetType() == (uint)NMT_CLIENT_TIMEOUT); CNetClient* client = (CNetClient*)context; JSContext* cx = client->GetScriptInterface().GetContext(); if (client->GetCurrState() == NCS_LOADING) return true; CClientTimeoutMessage* message = (CClientTimeoutMessage*)event->GetParamRef(); JS::RootedValue msg(cx); client->GetScriptInterface().Eval("({ 'type':'netwarn', 'warntype': 'client-timeout' })", &msg); client->GetScriptInterface().SetProperty(msg, "guid", std::string(message->m_GUID)); client->GetScriptInterface().SetProperty(msg, "lastReceivedTime", message->m_LastReceivedTime); client->PushGuiMessage(msg); return true; }
int main(int argc, const char **argv) // ignore_convention { int64 LastUpdate = time_get(); dbg_logger_stdout(); net_init(); IKernel *pKernel = IKernel::Create(); IStorage *pStorage = CreateStorage("Teeworlds", argc, argv); // ignore_convention m_pConsole = CreateConsole(CFGFLAG_BANMASTER); m_pConsole->RegisterPrintCallback(StandardOutput, 0); m_pConsole->Register("ban", "s?r", CFGFLAG_BANMASTER, ConBan, 0, "Bans the specified ip", 0); m_pConsole->Register("unban_all", "", CFGFLAG_BANMASTER, ConUnbanAll, 0, "Unbans all ips", 0); m_pConsole->Register("bind", "s", CFGFLAG_BANMASTER, ConSetBindAddr, 0, "Binds to the specified address", 0); { bool RegisterFail = false; RegisterFail = RegisterFail || !pKernel->RegisterInterface(m_pConsole); RegisterFail = RegisterFail || !pKernel->RegisterInterface(pStorage); if(RegisterFail) return -1; } m_pConsole->ExecuteFile(BANMASTER_BANFILE); NETADDR BindAddr; if(m_aBindAddr[0] && net_host_lookup(m_aBindAddr, &BindAddr, NETTYPE_IPV4) == 0) { if(BindAddr.port == 0) BindAddr.port = BANMASTER_PORT; } else { mem_zero(&BindAddr, sizeof(BindAddr)); BindAddr.port = BANMASTER_PORT; } m_Net.Open(BindAddr, 0); // TODO: DDRace: heinrich5991: check socket for errors dbg_msg("banmaster", "started"); while(1) { m_Net.Update(); // process m_aPackets CNetChunk p; while(m_Net.Recv(&p)) { if(p.m_DataSize >= (int)sizeof(BANMASTER_IPCHECK) && !mem_comp(p.m_pData, BANMASTER_IPCHECK, sizeof(BANMASTER_IPCHECK))) { char *pAddr = (char*)p.m_pData + sizeof(BANMASTER_IPCHECK); NETADDR CheckAddr; if(net_addr_from_str(&CheckAddr, pAddr)) { dbg_msg("banmaster", "dropped weird message ip=%d.%d.%d.%d checkaddr='%s'", p.m_Address.ip[0], p.m_Address.ip[1], p.m_Address.ip[2], p.m_Address.ip[3], pAddr); } else { int Banned = SendResponse(&p.m_Address, &CheckAddr); dbg_msg("banmaster", "responded to checkmsg ip=%d.%d.%d.%d checkaddr=%d.%d.%d.%d result=%s", p.m_Address.ip[0], p.m_Address.ip[1], p.m_Address.ip[2], p.m_Address.ip[3], CheckAddr.ip[0], CheckAddr.ip[1], CheckAddr.ip[2], CheckAddr.ip[3], (Banned) ? "ban" : "ok"); } } } if(time_get() - LastUpdate > time_freq() * BAN_REREAD_TIME) { ClearBans(); LastUpdate = time_get(); m_pConsole->ExecuteFile(BANMASTER_BANFILE); } // be nice to the CPU thread_sleep(1); } return 0; }
int main(int argc, char **argv) // ignore_convention { NETADDR BindAddr; dbg_logger_stdout(); net_init(); mem_zero(&BindAddr, sizeof(BindAddr)); BindAddr.type = NETTYPE_ALL; BindAddr.port = VERSIONSRV_PORT; if(!g_NetOp.Open(BindAddr, 0)) { dbg_msg("mastersrv", "couldn't start network"); return -1; } BuildPackets(); ReadNews(); ReadServerList(); dbg_msg("versionsrv", "started"); while(1) { g_NetOp.Update(); // process packets CNetChunk Packet; while(g_NetOp.Recv(&Packet)) { if(Packet.m_DataSize == sizeof(VERSIONSRV_GETVERSION) && mem_comp(Packet.m_pData, VERSIONSRV_GETVERSION, sizeof(VERSIONSRV_GETVERSION)) == 0) { SendVer(&Packet.m_Address); char aAddrStr[NETADDR_MAXSTRSIZE]; net_addr_str(&Packet.m_Address, aAddrStr, sizeof(aAddrStr), false); dbg_msg("versionsrv", "version request by %s", aAddrStr); } if(Packet.m_DataSize == sizeof(VERSIONSRV_GETNEWS) && mem_comp(Packet.m_pData, VERSIONSRV_GETNEWS, sizeof(VERSIONSRV_GETNEWS)) == 0) { SendNews(&Packet.m_Address); } if(Packet.m_DataSize == sizeof(VERSIONSRV_GETMAPLIST) && mem_comp(Packet.m_pData, VERSIONSRV_GETMAPLIST, sizeof(VERSIONSRV_GETMAPLIST)) == 0) { CNetChunk p; p.m_ClientID = -1; p.m_Address = Packet.m_Address; p.m_Flags = NETSENDFLAG_CONNLESS; for(int i = 0; i < m_NumPackets; i++) { p.m_DataSize = m_aPackets[i].m_Size; p.m_pData = &m_aPackets[i].m_Data; g_NetOp.Send(&p); } } if(m_ServerListLoaded && Packet.m_DataSize == sizeof(VERSIONSRV_GETDDNETLIST) + 4 && mem_comp(Packet.m_pData, VERSIONSRV_GETDDNETLIST, sizeof(VERSIONSRV_GETDDNETLIST)) == 0) { char aToken[4]; mem_copy(aToken, (char*)Packet.m_pData+sizeof(VERSIONSRV_GETDDNETLIST), 4); SendServerList(&Packet.m_Address, aToken); } } // wait for input net_socket_read_wait(g_NetOp.m_Socket, 1000000); } return 0; }