void C4Network2IRCClient::OnMessage(bool fNotice, const char *szSender, const char *szTarget, const char *szText) { // Find channel, if not private. C4Network2IRCChannel *pChan = NULL; if(!SEqualNoCase(szTarget, Nick.getData())) pChan = getChannel(szTarget); // CTCP tagged data? const char X_DELIM = '\001'; if(szText[0] == X_DELIM) { // Process messages (it's very rarely more than one, but the spec allows it) const char *pMsg = szText + 1; while(*pMsg) { // Find end const char *pEnd = strchr(pMsg, X_DELIM); if(!pEnd) pEnd = pMsg + SLen(pMsg); // Copy CTCP query/reply, get tag StdStrBuf CTCP; CTCP.Copy(pMsg, pEnd - pMsg); StdStrBuf Tag; Tag.CopyUntil(CTCP.getData(), ' '); const char *szData = SSearch(CTCP.getData(), " "); StdStrBuf Sender; Sender.CopyUntil(szSender, '!'); // Process if(SEqualNoCase(Tag.getData(), "ACTION")) PushMessage(MSG_Action, szSender, szTarget, szData ? szData : ""); if(SEqualNoCase(Tag.getData(), "FINGER") && !fNotice) { StdStrBuf Answer; if(Config.Registered()) { Answer = Config.GetRegistrationData("Cuid"); } else { Answer = LoadResStr("IDS_PRC_UNREGUSER"); } Send("NOTICE", FormatString("%s :%cFINGER %s%c", Sender.getData(), X_DELIM, Answer.getData(), X_DELIM).getData()); } if(SEqualNoCase(Tag.getData(), "VERSION") && !fNotice) Send("NOTICE", FormatString("%s :%cVERSION " C4ENGINECAPTION ":" C4VERSION ":" C4_OS "%c", Sender.getData(), X_DELIM, X_DELIM).getData()); if(SEqualNoCase(Tag.getData(), "PING") && !fNotice) Send("NOTICE", FormatString("%s :%cPING %s%c", Sender.getData(), X_DELIM, szData, X_DELIM).getData()); // Get next message pMsg = pEnd; if(*pMsg == X_DELIM) pMsg++; } } // Standard message (not CTCP tagged): Push else PushMessage(fNotice ? MSG_Notice : MSG_Message, szSender, szTarget, szText); }
bool CNewFilesBox::Cancelled() { if (m_SuspendRq) { // We can suspend the process between frames tStateCode old_state = m_State; m_State = STATE_SUSPENDED; PushMessage(EVENT_UPDATE, 0); g_cond_wait(m_Cond, m_DataMutex); m_State = old_state; PushMessage(EVENT_UPDATE, 0); } // Return FALSE to abort the process return m_StopThread; }
// ----------------------------------------------------------------------------- // push a text message // ----------------------------------------------------------------------------- void Networking_impl::PushText( const std::string &text ) { NetMessage msgOut; msgOut.mType = MSG_TEXT; strcpy( (char *)msgOut.data, text.c_str() ); PushMessage( msgOut ); }
//! 压入一个定时消息 BOOL AinMsgQueue::PushTimeMessage(AinMessage* pMsg, DWORD dwMillisecond) { if(NULL == pMsg) return FALSE; if(0 == dwMillisecond) return PushMessage(pMsg); DWORD dwCurrTime = timeGetTime(); DWORD dwBeginTime = dwCurrTime + dwMillisecond; m_Lock.Lock(); { do { if(m_timeMsgQueue.end() != m_timeMsgQueue.find(dwBeginTime)) ++dwBeginTime; else break; } while(true); m_timeMsgQueue[dwBeginTime] = pMsg; m_dwMinBeginTime = min(m_dwMinBeginTime, dwBeginTime); } m_Lock.UnLock(); return TRUE; }
bool C4Network2IRCClient::Notice(const char *szTarget, const char *szText) { if(!Send("NOTICE", FormatString("%s :%s", szTarget, szText).getData())) return false; PushMessage(MSG_Notice, Nick.getData(), szTarget, szText); return true; }
bool C4Network2IRCClient::Action(const char *szTarget, const char *szText) { if(!Send("PRIVMSG", FormatString("%s :\1ACTION %s\1", szTarget, szText).getData())) return false; PushMessage(MSG_Action, Nick.getData(), szTarget, szText); return true; }
void CDemo::OnForwardingSuccess(const char *proxyIPAddress, unsigned short proxyPort, SystemAddress proxyCoordinator, SystemAddress sourceAddress, SystemAddress targetAddress, RakNet::UDPProxyClient *proxyClientPlugin) { RakNet::RakString targetName = targetAddress.ToString(); PushMessage(RakNet::RakString("Proxy forwarding to ") + targetName + RakNet::RakString(" through %s:%i succeeded. Connecting.", proxyIPAddress, proxyPort)); rakPeer->Connect(proxyIPAddress, proxyPort,0,0); }
void CNode::PushGetBlocks(CBlockIndex* pindexBegin, uint256 hashEnd) { // Filter out duplicate requests if (pindexBegin == pindexLastGetBlocksBegin && hashEnd == hashLastGetBlocksEnd) return; pindexLastGetBlocksBegin = pindexBegin; hashLastGetBlocksEnd = hashEnd; PushMessage("getblocks", CBlockLocator(pindexBegin), hashEnd); }
void CSelfNode::sendMessages() { boost::lock_guard<boost::mutex> lock( m_mutex ); if ( !m_messagesToSend.empty() ) PushMessage("dims", m_messagesToSend); m_messagesToSend.clear(); }
void SocketPeer::onReadEvent(rtc::AsyncSocket* socket) { unsigned char temp[2048]; int ret = sock_->Recv(temp, sizeof(temp) - 1); if ( ret > 0) { temp[ret] = 0; std::string msg ( (const char *)temp ); PushMessage( msg ); } }
void CNewFilesBox::Print(const char *text) { int textlen; char *buffer; textlen = strlen(text); buffer = (char*)g_malloc(textlen+2); memcpy(buffer, text, textlen); buffer[textlen] = '\n'; buffer[textlen+1] = '\0'; PushMessage(EVENT_MESSAGE, buffer); }
bool CMagicState::CheckInterrupt() { if(m_interruptSpell) { PushMessage(MSGBASIC_IS_INTERRUPTED); return true; } if(!m_PTargetFind->isWithinRange(&m_PTarget->loc.p, m_maxFinishDistance)) { PushError(MSGBASIC_OUT_OF_RANGE_UNABLE_CAST, m_PSpell->getID()); return true; } // check if in same place if(m_PEntity->objtype == TYPE_PC && HasMoved()) { PushError(MSGBASIC_IS_INTERRUPTED, m_PSpell->getID()); return true; } if(!ValidCast(m_PSpell, m_PTarget)) { return true; } if(battleutils::IsIntimidated(m_PEntity, m_PTarget)) { PushMessage(MSGBASIC_IS_INTIMIDATED); return true; } if(battleutils::IsParalyzed(m_PEntity)) { PushMessage(MSGBASIC_IS_PARALYZED); return true; } return false; }
//============================================================ // <T>以堵塞方式压入一个消息。</T> // // @param pMessage 消息对象 // @return 处理结果 //============================================================ TBool FSharedNetQueue::BlockedPushMessage(TNetMessage* pMessage){ MO_ASSERT(pMessage); TBool result = EFalse; // 服务线程和收取线程可能同时操作,需要同步锁 _lockPush.Enter(); result = PushMessage(pMessage); _lockPush.Leave(); // 根据结果处理 if(result){ return ETrue; } return EFalse; }
bool C4Network2IRCClient::Join(const char *szChannel) { // Newbie limitation: can only join channels beginning with #clonk if (!Config.IRC.AllowAllChannels) if (!SEqual2NoCase(szChannel, "#clonk")) { PushMessage(MSG_Status, "", "", "Can only join channels beginning with #clonk."); SetError("Joining this channel not allowed"); if (C4GUI::Screen::GetScreenS()) C4GUI::Screen::GetScreenS()->ShowMessage(LoadResStr("IDS_CHAT_CHANNELNOTALLOWED"), LoadResStr("IDS_DLG_CHAT"), C4GUI::Ico_Error); return false; } return Send("JOIN", szChannel); }
void CNewFilesBox::OnThreadProc(void) { GTimeVal time; g_mutex_lock(m_DataMutex); while (!Cancelled()) { m_Delay = true; g_mutex_unlock(m_DataMutex); m_Checker.Check(NewFrameCB, this); g_mutex_lock(m_DataMutex); if (m_Delay && !m_StopThread) { if (m_State!=STATE_WAIT) { m_State = STATE_WAIT; PushMessage(EVENT_UPDATE, 0); } g_get_current_time(&time); g_time_val_add(&time, 3000000); g_cond_timed_wait(m_Cond, m_DataMutex, &time); } } m_State = STATE_STOP; PushMessage(EVENT_UPDATE, 0); g_mutex_unlock(m_DataMutex); }
void winSendMessageToWM (void *pWMInfo, winWMMessagePtr pMsg) { WMMsgNodePtr pNode; #if CYGMULTIWINDOW_DEBUG ErrorF ("winSendMessageToWM ()\n"); #endif pNode = (WMMsgNodePtr)malloc(sizeof(WMMsgNodeRec)); if (pNode != NULL) { memcpy (&pNode->msg, pMsg, sizeof(winWMMessageRec)); PushMessage (&((WMInfoPtr)pWMInfo)->wmMsgQueue, pNode); } }
void NetworkingEngine::PushMessage( const T &msg, EntityIDTable::EntityID dest ) { // Translate ID to CreationKey const EntityIDTable::CreationKey *destKey = entityIDTable.GetKey( dest ); ASSERT( destKey == NULL, "There is no CreationKey associated with this EntityID" ); NetMessage netMsg; netMsg.mType = MSG_DATA; netMsg.addrFrom = saMyAddr.sin_addr.s_addr; netMsg.nSize = sizeof( msg ); //netMsg.dest = *destKey; if ( msg.toResend ) netMsg.flags |= NetMessage::FLAG_RELAY_BACK; if ( msg.reliable ) netMsg.flags |= NetMessage::FLAG_RELIABLE; memcpy( netMsg.data, &msg, netMsg.nSize ); PushMessage( netMsg ); }
// // Start process // void CNewFilesBox::OnShow(void) { if (m_Thread) return; Clear(); CMessagesDlg::InitBuffer(); if (m_Checker.Init()) { m_State = STATE_WAIT; m_StopThread = m_SuspendRq = false; m_Thread = g_thread_create(GThreadFunc(thread_proc), this, TRUE, NULL); gtk_widget_set_sensitive(m_PauseBtn, TRUE); } else { gtk_label_set_text(GTK_LABEL(m_Line2), "The directory does not exist."); m_State = STATE_STOP; } PushMessage(EVENT_UPDATE, 0); }
bool CNewFilesBox::OnNewFrame(const CFrameInfo &frame, bool *try_again) { int res; bool retval; // Initialization if (!m_Proc) { m_Proc = new CUpdateProc(); if (m_Proc->Init(m_Con)!=0) { delete m_Proc; m_Proc = NULL; m_StopThread = TRUE; } if (!m_Proc) return false; } // Process file g_mutex_lock(m_DataMutex); m_State = STATE_WORK; PushMessage(EVENT_UPDATE, 0); g_mutex_unlock(m_DataMutex); g_Project->Lock(); if (!g_Project->FileInProject(frame.FullPath())) { GtkTreePath *path = g_Project->AddFile(frame); if (path) { g_Project->Unlock(); res = m_Proc->Execute(path); if (res==CMPACK_ERR_CANT_OPEN_SRC) *try_again = TRUE; if (res==0) { m_Delay = false; m_OutFiles++; } g_Project->Lock(); gtk_tree_path_free(path); } } g_Project->Unlock(); g_mutex_lock(m_DataMutex); retval = !Cancelled(); g_mutex_unlock(m_DataMutex); return retval; }
void CDemo::OnNoServersOnline(SystemAddress proxyCoordinator, SystemAddress sourceAddress, SystemAddress targetAddress, RakNet::UDPProxyClient *proxyClientPlugin) { PushMessage(RakNet::RakString("RakNet::RakString(No proxy servers online. Unable to connect to %s.", sourceAddress.ToString(true))); }
void CDemo::OnForwardingInProgress(SystemAddress proxyCoordinator, SystemAddress sourceAddress, SystemAddress targetAddress, RakNet::UDPProxyClient *proxyClientPlugin) { PushMessage(RakNet::RakString("Forwarding to %s already in progress. Ignoring.", sourceAddress.ToString(true))); }
void C4Network2IRCClient::OnCommand(const char *szSender, const char *szCommand, const char *szParameters) { CStdLock Lock(&CSec); // Numeric command? if(isdigit((unsigned char)*szCommand) && SLen(szCommand) == 3) { OnNumericCommand(szSender, atoi(szCommand), szParameters); return; } // Sender's nick StdStrBuf SenderNick; if(szSender) SenderNick.CopyUntil(szSender, '!'); // Ping? if(SEqualNoCase(szCommand, "PING")) Send("PONG", szParameters); // Message? if(SEqualNoCase(szCommand, "NOTICE") || SEqualNoCase(szCommand, "PRIVMSG")) { // Get target StdStrBuf Target = ircExtractPar(&szParameters); // Get text StdStrBuf Text = ircExtractPar(&szParameters); // Process message OnMessage(SEqualNoCase(szCommand, "NOTICE"), szSender, Target.getData(), Text.getData()); } // Channel join? if(SEqualNoCase(szCommand, "JOIN")) { // Get channel StdStrBuf Channel = ircExtractPar(&szParameters); C4Network2IRCChannel *pChan = AddChannel(Channel.getData()); // Add user pChan->OnJoin(SenderNick.getData()); // Myself? if(SenderNick == Nick) PushMessage(MSG_Status, szSender, Channel.getData(), FormatString(LoadResStr("IDS_MSG_YOUHAVEJOINEDCHANNEL"), Channel.getData()).getData()); else PushMessage(MSG_Status, szSender, Channel.getData(), FormatString(LoadResStr("IDS_MSG_HASJOINEDTHECHANNEL"), SenderNick.getData()).getData()); } // Channel part? if(SEqualNoCase(szCommand, "PART")) { // Get channel StdStrBuf Channel = ircExtractPar(&szParameters); C4Network2IRCChannel *pChan = AddChannel(Channel.getData()); // Get message StdStrBuf Comment = ircExtractPar(&szParameters); // Remove user pChan->OnPart(SenderNick.getData(), Comment.getData()); // Myself? if(SenderNick == Nick) { DeleteChannel(pChan); PushMessage(MSG_Status, szSender, Nick.getData(), FormatString(LoadResStr("IDS_MSG_YOUHAVELEFTCHANNEL"), Channel.getData(), Comment.getData()).getData()); } else PushMessage(MSG_Status, szSender, Channel.getData(), FormatString(LoadResStr("IDS_MSG_HASLEFTTHECHANNEL"), SenderNick.getData(), Comment.getData()).getData()); } // Kick? if(SEqualNoCase(szCommand, "KICK")) { // Get channel StdStrBuf Channel = ircExtractPar(&szParameters); C4Network2IRCChannel *pChan = AddChannel(Channel.getData()); // Get kicked user StdStrBuf Kicked = ircExtractPar(&szParameters); // Get message StdStrBuf Comment = ircExtractPar(&szParameters); // Remove user pChan->OnKick(Kicked.getData(), Comment.getData()); // Myself? if(Kicked == Nick) { DeleteChannel(pChan); PushMessage(MSG_Status, szSender, Nick.getData(), FormatString(LoadResStr("IDS_MSG_YOUWEREKICKEDFROMCHANNEL"), Channel.getData(), Comment.getData()).getData()); } else PushMessage(MSG_Status, szSender, Channel.getData(), FormatString(LoadResStr("IDS_MSG_WASKICKEDFROMTHECHANNEL"), Kicked.getData(), Comment.getData()).getData()); } // Quit? if(SEqualNoCase(szCommand, "QUIT")) { // Get comment StdStrBuf Comment = ircExtractPar(&szParameters); // Format status message StdStrBuf Message = FormatString(LoadResStr("IDS_MSG_HASDISCONNECTED"), SenderNick.getData(), Comment.getData()); // Remove him from all channels for(C4Network2IRCChannel *pChan = pChannels; pChan; pChan = pChan->Next) if(pChan->getUser(SenderNick.getData())) { pChan->OnPart(SenderNick.getData(), "Quit"); PushMessage(MSG_Status, szSender, pChan->getName(), Message.getData()); } } // Topic change? if(SEqualNoCase(szCommand, "TOPIC")) { // Get channel and topic StdStrBuf Channel = ircExtractPar(&szParameters); StdStrBuf Topic = ircExtractPar(&szParameters); // Set topic AddChannel(Channel.getData())->OnTopic(Topic.getData()); // Message PushMessage(MSG_Status, szSender, Channel.getData(), FormatString(LoadResStr("IDS_MSG_CHANGESTHETOPICTO"), SenderNick.getData(), Topic.getData()).getData()); } // Mode? if(SEqualNoCase(szCommand, "MODE")) { // Get all data StdStrBuf Channel = ircExtractPar(&szParameters); StdStrBuf Flags = ircExtractPar(&szParameters); StdStrBuf What = ircExtractPar(&szParameters); // Make sure it's a channel C4Network2IRCChannel *pChan = getChannel(Channel.getData()); if(pChan) // Ask for names, because user prefixes might be out of sync Send("NAMES", Channel.getData()); // Show Message PushMessage(MSG_Status, szSender, Channel.getData(), FormatString(LoadResStr("IDS_MSG_SETSMODE"), SenderNick.getData(), Flags.getData(), What.getData()).getData()); } // Error? if(SEqualNoCase(szCommand, "ERROR")) { // Get message StdStrBuf Message = ircExtractPar(&szParameters); // Push it PushMessage(MSG_Server, szSender, Nick.getData(), Message.getData()); } // Nickchange? if(SEqualNoCase(szCommand, "NICK")) { // Get new nick StdStrBuf NewNick = ircExtractPar(&szParameters); // Format status message StdStrBuf Message = FormatString(LoadResStr("IDS_MSG_ISNOWKNOWNAS"), SenderNick.getData(), NewNick.getData()); // Rename on all channels for(C4Network2IRCChannel *pChan = pChannels; pChan; pChan = pChan->Next) if(pChan->getUser(SenderNick.getData())) { pChan->OnPart(SenderNick.getData(), "Nickchange"); pChan->OnJoin(NewNick.getData()); PushMessage(MSG_Status, szSender, pChan->getName(), Message.getData()); } // Self? if(SenderNick == Nick) Nick = NewNick; } }
void C4Network2IRCClient::OnNumericCommand(const char *szSender, int iCommand, const char *szParameters) { bool fShowMessage = true; // Get target StdStrBuf Target = ircExtractPar(&szParameters); // Handle command switch(iCommand) { case 433: // Nickname already in use { StdStrBuf DesiredNick = ircExtractPar(&szParameters); // Automatically try to choose a new one DesiredNick.AppendChar('_'); Send("NICK", DesiredNick.getData()); break; } case 376: // End of MOTD case 422: // MOTD missing // Let's take this a sign that the connection is established. OnConnected(); break; case 331: // No topic set case 332: // Topic notify / change { // Get Channel name and topic StdStrBuf Channel = ircExtractPar(&szParameters); StdStrBuf Topic = (iCommand == 332 ? ircExtractPar(&szParameters) : StdStrBuf("")); // Set it AddChannel(Channel.getData())->OnTopic(Topic.getData()); // Log if(Topic.getLength()) PushMessage(MSG_Status, szSender, Channel.getData(), FormatString(LoadResStr("IDS_MSG_TOPICIN"), Channel.getData(), Topic.getData()).getData()); } break; case 333: // Last topic change fShowMessage = false; // ignore break; case 353: // Names in channel { // Get Channel name and name list StdStrBuf Junk = ircExtractPar(&szParameters); // ??! StdStrBuf Channel = ircExtractPar(&szParameters); StdStrBuf Names = ircExtractPar(&szParameters); // Set it AddChannel(Channel.getData())->OnUsers(Names.getData(), Prefixes.getData()); fShowMessage = false; } break; case 366: // End of names list { // Get Channel name StdStrBuf Channel = ircExtractPar(&szParameters); // Finish AddChannel(Channel.getData())->OnUsersEnd(); fShowMessage = false; // Notify if(pNotify) pNotify->PushEvent(Ev_IRC_Message, this); } break; case 4: // Server version fShowMessage = false; // ignore break; case 5: // Server support string { while(szParameters && *szParameters) { // Get support-token. StdStrBuf Token = ircExtractPar(&szParameters); StdStrBuf Parameter; Parameter.CopyUntil(Token.getData(), '='); // Check if it's interesting and safe data if so. if(SEqualNoCase(Parameter.getData(), "PREFIX")) Prefixes.Copy(SSearch(Token.getData(), "=")); } fShowMessage = false; } break; } // Show embedded message, if any? if(fShowMessage) { // Check if first parameter is some sort of channel name C4Network2IRCChannel *pChannel = NULL; if(szParameters && *szParameters && *szParameters != ':') pChannel = getChannel(ircExtractPar(&szParameters).getData()); // Go over other parameters const char *pMsg = szParameters; while(pMsg && *pMsg && *pMsg != ':') pMsg = SSearch(pMsg, " "); // Show it if(pMsg && *pMsg) if(!pChannel) PushMessage(MSG_Server, szSender, Nick.getData(), pMsg + 1); else PushMessage(MSG_Status, szSender, pChannel->getName(), pMsg + 1); } }
void CDemo::OnAllServersBusy(SystemAddress proxyCoordinator, SystemAddress sourceAddress, SystemAddress targetAddress, RakNet::UDPProxyClient *proxyClientPlugin) { PushMessage(RakNet::RakString("No proxy servers available. Unable to connect to %s.", sourceAddress.ToString(true))); }
void CDemo::OnRecipientNotConnected(SystemAddress proxyCoordinator, SystemAddress sourceAddress, SystemAddress targetAddress, RakNetGUID targetGuid, RakNet::UDPProxyClient *proxyClientPlugin) { PushMessage(RakNet::RakString("Failure: Recipient not connected to coordinator.\n")); }
/// RakNet stuff void CDemo::UpdateRakNet(void) { RakNet::SystemAddress facilitatorSystemAddress(DEFAULT_NAT_PUNCHTHROUGH_FACILITATOR_IP, DEFAULT_NAT_PUNCHTHROUGH_FACILITATOR_PORT); RakNet::Packet *packet; RakNet::TimeMS curTime = RakNet::GetTimeMS(); RakNet::RakString targetName; for (packet=rakPeer->Receive(); packet; rakPeer->DeallocatePacket(packet), packet=rakPeer->Receive()) { if (strcmp(packet->systemAddress.ToString(false),DEFAULT_NAT_PUNCHTHROUGH_FACILITATOR_IP)==0) { targetName="NATPunchthroughServer"; } else { targetName=packet->systemAddress.ToString(true); } switch (packet->data[0]) { case ID_IP_RECENTLY_CONNECTED: { PushMessage(RakNet::RakString("This IP address recently connected from ") + targetName + RakNet::RakString(".")); if (packet->systemAddress==facilitatorSystemAddress) PushMessage("Multiplayer will not work without the NAT punchthrough server!"); } break; case ID_INCOMPATIBLE_PROTOCOL_VERSION: { PushMessage(RakNet::RakString("Incompatible protocol version from ") + targetName + RakNet::RakString(".")); if (packet->systemAddress==facilitatorSystemAddress) PushMessage("Multiplayer will not work without the NAT punchthrough server!"); } break; case ID_DISCONNECTION_NOTIFICATION: { PushMessage(RakNet::RakString("Disconnected from ") + targetName + RakNet::RakString(".")); if (packet->systemAddress==facilitatorSystemAddress) isConnectedToNATPunchthroughServer=false; } break; case ID_CONNECTION_LOST: { PushMessage(RakNet::RakString("Connection to ") + targetName + RakNet::RakString(" lost.")); if (packet->systemAddress==facilitatorSystemAddress) isConnectedToNATPunchthroughServer=false; } break; case ID_NO_FREE_INCOMING_CONNECTIONS: { PushMessage(RakNet::RakString("No free incoming connections to ") + targetName + RakNet::RakString(".")); if (packet->systemAddress==facilitatorSystemAddress) PushMessage("Multiplayer will not work without the NAT punchthrough server!"); } break; case ID_NEW_INCOMING_CONNECTION: { if (fullyConnectedMesh2->IsHostSystem()) { PushMessage(RakNet::RakString("Sending player list to new connection")); fullyConnectedMesh2->StartVerifiedJoin(packet->guid); } } break; case ID_FCM2_VERIFIED_JOIN_START: { DataStructures::List<RakNet::SystemAddress> addresses; DataStructures::List<RakNet::RakNetGUID> guids; fullyConnectedMesh2->GetVerifiedJoinRequiredProcessingList(packet->guid, addresses, guids); for (unsigned int i=0; i < guids.Size(); i++) natPunchthroughClient->OpenNAT(guids[i], facilitatorSystemAddress); } break; case ID_FCM2_VERIFIED_JOIN_FAILED: { PushMessage(RakNet::RakString("Failed to join game session")); } break; case ID_FCM2_VERIFIED_JOIN_CAPABLE: { fullyConnectedMesh2->RespondOnVerifiedJoinCapable(packet, true, 0); } break; case ID_FCM2_VERIFIED_JOIN_ACCEPTED: { DataStructures::List<RakNet::RakNetGUID> systemsAccepted; bool thisSystemAccepted; fullyConnectedMesh2->GetVerifiedJoinAcceptedAdditionalData(packet, &thisSystemAccepted, systemsAccepted, 0); if (thisSystemAccepted) PushMessage("Game join request accepted\n"); else PushMessage(RakNet::RakString("System %s joined the mesh\n", systemsAccepted[0].ToString())); // DataStructures::List<RakNetGUID> participantList; // fullyConnectedMesh2->GetParticipantList(participantList); for (unsigned int i=0; i < systemsAccepted.Size(); i++) replicaManager3->PushConnection(replicaManager3->AllocConnection(rakPeer->GetSystemAddressFromGuid(systemsAccepted[i]), systemsAccepted[i])); } break; case ID_CONNECTION_REQUEST_ACCEPTED: { PushMessage(RakNet::RakString("Connection request to ") + targetName + RakNet::RakString(" accepted.")); if (packet->systemAddress==facilitatorSystemAddress) { isConnectedToNATPunchthroughServer=true; // Open UPNP. struct UPNPDev * devlist = 0; devlist = upnpDiscover(1000, 0, 0, 0); if (devlist) { char lanaddr[64]; /* my ip address on the LAN */ struct UPNPUrls urls; struct IGDdatas data; if (UPNP_GetValidIGD(devlist, &urls, &data, lanaddr, sizeof(lanaddr))==1) { // External port is the port people will be connecting to us on. This is our port as seen by the directory server // Internal port is the port RakNet was internally started on char eport[32], iport[32]; natPunchthroughClient->GetUPNPPortMappings(eport, iport, facilitatorSystemAddress); int r = UPNP_AddPortMapping(urls.controlURL, data.first.servicetype, eport, iport, lanaddr, 0, "UDP", 0); if(r==UPNPCOMMAND_SUCCESS) { // UPNP done } } } // Query cloud for other running game instances RakNet::CloudQuery cloudQuery; cloudQuery.keys.Push(RakNet::CloudKey("IrrlichtDemo",0),_FILE_AND_LINE_); cloudClient->Get(&cloudQuery, packet->guid); } } break; case ID_FCM2_NEW_HOST: { if (packet->guid==rakPeer->GetMyGUID()) { // Original host dropped. I am the new session host. Upload to the cloud so new players join this system. RakNet::CloudKey cloudKey("IrrlichtDemo",0); cloudClient->Post(&cloudKey, 0, 0, rakPeer->GetGuidFromSystemAddress(facilitatorSystemAddress)); } } break; case ID_CLOUD_GET_RESPONSE: { RakNet::CloudQueryResult cloudQueryResult; cloudClient->OnGetReponse(&cloudQueryResult, packet); if (cloudQueryResult.rowsReturned.Size()>0) { PushMessage(RakNet::RakString("NAT punch to existing game instance")); natPunchthroughClient->OpenNAT(cloudQueryResult.rowsReturned[0]->clientGUID, facilitatorSystemAddress); } else { PushMessage(RakNet::RakString("Publishing new game instance")); // Start as a new game instance because no other games are running RakNet::CloudKey cloudKey("IrrlichtDemo",0); cloudClient->Post(&cloudKey, 0, 0, packet->guid); } cloudClient->DeallocateWithDefaultAllocator(&cloudQueryResult); } break; case ID_CONNECTION_ATTEMPT_FAILED: { PushMessage(RakNet::RakString("Connection attempt to ") + targetName + RakNet::RakString(" failed.")); if (packet->systemAddress==facilitatorSystemAddress) PushMessage("Multiplayer will not work without the NAT punchthrough server!"); } break; case ID_NAT_TARGET_NOT_CONNECTED: { RakNet::RakNetGUID recipientGuid; RakNet::BitStream bs(packet->data,packet->length,false); bs.IgnoreBytes(sizeof(RakNet::MessageID)); bs.Read(recipientGuid); targetName=recipientGuid.ToString(); PushMessage(RakNet::RakString("NAT target ") + targetName + RakNet::RakString(" not connected.")); } break; case ID_NAT_TARGET_UNRESPONSIVE: { RakNet::RakNetGUID recipientGuid; RakNet::BitStream bs(packet->data,packet->length,false); bs.IgnoreBytes(sizeof(RakNet::MessageID)); bs.Read(recipientGuid); targetName=recipientGuid.ToString(); PushMessage(RakNet::RakString("NAT target ") + targetName + RakNet::RakString(" unresponsive.")); } break; case ID_NAT_CONNECTION_TO_TARGET_LOST: { RakNet::RakNetGUID recipientGuid; RakNet::BitStream bs(packet->data,packet->length,false); bs.IgnoreBytes(sizeof(RakNet::MessageID)); bs.Read(recipientGuid); targetName=recipientGuid.ToString(); PushMessage(RakNet::RakString("NAT target connection to ") + targetName + RakNet::RakString(" lost.")); } break; case ID_NAT_ALREADY_IN_PROGRESS: { RakNet::RakNetGUID recipientGuid; RakNet::BitStream bs(packet->data,packet->length,false); bs.IgnoreBytes(sizeof(RakNet::MessageID)); bs.Read(recipientGuid); targetName=recipientGuid.ToString(); PushMessage(RakNet::RakString("NAT punchthrough to ") + targetName + RakNet::RakString(" in progress (skipping).")); } break; case ID_NAT_PUNCHTHROUGH_SUCCEEDED: { if (packet->data[1]==1) { PushMessage(RakNet::RakString("Connecting to existing game instance")); RakNet::ConnectionAttemptResult car = rakPeer->Connect(packet->systemAddress.ToString(false), packet->systemAddress.GetPort(), 0, 0); RakAssert(car==RakNet::CONNECTION_ATTEMPT_STARTED); } } break; case ID_ADVERTISE_SYSTEM: if (packet->guid!=rakPeer->GetGuidFromSystemAddress(RakNet::UNASSIGNED_SYSTEM_ADDRESS)) { char hostIP[32]; packet->systemAddress.ToString(false,hostIP); RakNet::ConnectionAttemptResult car = rakPeer->Connect(hostIP,packet->systemAddress.GetPort(),0,0); RakAssert(car==RakNet::CONNECTION_ATTEMPT_STARTED); } break; } } // Call the Update function for networked game objects added to BaseIrrlichtReplica once the game is ready if (currentScene>=1) { unsigned int idx; for (idx=0; idx < replicaManager3->GetReplicaCount(); idx++) ((BaseIrrlichtReplica*)(replicaManager3->GetReplicaAtIndex(idx)))->Update(curTime);; } }
void C4Network2IRCClient::OnDisconn(const C4NetIO::addr_t &AddrPeer, C4NetIO *pNetIO, const char *szReason) { fConnected = false; // Show a message with the reason PushMessage(MSG_Status, "", Nick.getData(), FormatString(LoadResStr("IDS_MSG_DISCONNECTEDFROMSERVER"), szReason).getData()); }
void CDemo::OnForwardingNotification(const char *proxyIPAddress, unsigned short proxyPort, SystemAddress proxyCoordinator, SystemAddress sourceAddress, SystemAddress targetAddress, RakNet::UDPProxyClient *proxyClientPlugin) { RakNet::RakString targetName = proxyIPAddress; PushMessage(RakNet::RakString("%s has setup forwarding to us through proxy %s:%i.\n", sourceAddress.ToString(false), proxyIPAddress,proxyPort)); }
/// RakNet stuff void CDemo::UpdateRakNet(void) { SystemAddress facilitatorSystemAddress(DEFAULT_NAT_PUNCHTHROUGH_FACILITATOR_IP, DEFAULT_NAT_PUNCHTHROUGH_FACILITATOR_PORT); Packet *packet; RakNetTime curTime = RakNet::GetTime(); RakNet::RakString targetName; for (packet=rakPeer->Receive(); packet; rakPeer->DeallocatePacket(packet), packet=rakPeer->Receive()) { if (strcmp(packet->systemAddress.ToString(false),DEFAULT_NAT_PUNCHTHROUGH_FACILITATOR_IP)==0) { targetName="NATPunchthroughServer"; } else { targetName=packet->systemAddress.ToString(true); } switch (packet->data[0]) { case ID_IP_RECENTLY_CONNECTED: { PushMessage(RakNet::RakString("This IP address recently connected from ") + targetName + RakNet::RakString(".")); if (packet->systemAddress==facilitatorSystemAddress) PushMessage("Multiplayer will not work without the NAT punchthrough server!"); } break; case ID_INCOMPATIBLE_PROTOCOL_VERSION: { PushMessage(RakNet::RakString("Incompatible protocol version from ") + targetName + RakNet::RakString(".")); if (packet->systemAddress==facilitatorSystemAddress) PushMessage("Multiplayer will not work without the NAT punchthrough server!"); } break; case ID_DISCONNECTION_NOTIFICATION: { PushMessage(RakNet::RakString("Disconnected from ") + targetName + RakNet::RakString(".")); if (packet->systemAddress==facilitatorSystemAddress) isConnectedToNATPunchthroughServer=false; } break; case ID_CONNECTION_LOST: { PushMessage(RakNet::RakString("Connection to ") + targetName + RakNet::RakString(" lost.")); if (packet->systemAddress==facilitatorSystemAddress) isConnectedToNATPunchthroughServer=false; } break; case ID_NO_FREE_INCOMING_CONNECTIONS: { PushMessage(RakNet::RakString("No free incoming connections to ") + targetName + RakNet::RakString(".")); if (packet->systemAddress==facilitatorSystemAddress) PushMessage("Multiplayer will not work without the NAT punchthrough server!"); } break; case ID_NEW_INCOMING_CONNECTION: { PushMessage(RakNet::RakString("New incoming connection from ") + targetName + RakNet::RakString(".")); // Add this system as a new player replicaManager3->PushConnection(replicaManager3->AllocConnection(packet->systemAddress, packet->guid)); } break; case ID_CONNECTION_REQUEST_ACCEPTED: { PushMessage(RakNet::RakString("Connection request to ") + targetName + RakNet::RakString(" accepted.")); if (packet->systemAddress==facilitatorSystemAddress) { isConnectedToNATPunchthroughServer=true; } else { // Add this system as a new player replicaManager3->PushConnection(replicaManager3->AllocConnection(packet->systemAddress, packet->guid)); } } break; case ID_CONNECTION_ATTEMPT_FAILED: { PushMessage(RakNet::RakString("Connection attempt to ") + targetName + RakNet::RakString(" failed.")); if (packet->systemAddress==facilitatorSystemAddress) PushMessage("Multiplayer will not work without the NAT punchthrough server!"); } break; case ID_NAT_TARGET_NOT_CONNECTED: { RakNetGUID recipientGuid; RakNet::BitStream bs(packet->data,packet->length,false); bs.IgnoreBytes(sizeof(MessageID)); bs.Read(recipientGuid); targetName=recipientGuid.ToString(); PushMessage(RakNet::RakString("NAT target ") + targetName + RakNet::RakString(" not connected.")); } break; case ID_NAT_TARGET_UNRESPONSIVE: { RakNetGUID recipientGuid; RakNet::BitStream bs(packet->data,packet->length,false); bs.IgnoreBytes(sizeof(MessageID)); bs.Read(recipientGuid); targetName=recipientGuid.ToString(); PushMessage(RakNet::RakString("NAT target ") + targetName + RakNet::RakString(" unresponsive.")); } break; case ID_NAT_CONNECTION_TO_TARGET_LOST: { RakNetGUID recipientGuid; RakNet::BitStream bs(packet->data,packet->length,false); bs.IgnoreBytes(sizeof(MessageID)); bs.Read(recipientGuid); targetName=recipientGuid.ToString(); PushMessage(RakNet::RakString("NAT target connection to ") + targetName + RakNet::RakString(" lost.")); } break; case ID_NAT_ALREADY_IN_PROGRESS: { RakNetGUID recipientGuid; RakNet::BitStream bs(packet->data,packet->length,false); bs.IgnoreBytes(sizeof(MessageID)); bs.Read(recipientGuid); targetName=recipientGuid.ToString(); PushMessage(RakNet::RakString("NAT punchthrough to ") + targetName + RakNet::RakString(" in progress (skipping).")); } break; case ID_NAT_PUNCHTHROUGH_FAILED: { targetName=packet->guid.ToString(); unsigned char weAreSender=packet->data[1]; if (weAreSender) { PushMessage(RakNet::RakString("Punchthrough to ") + targetName + RakNet::RakString(" failed. Using proxy.")); udpProxyClient->RequestForwarding(facilitatorSystemAddress, UNASSIGNED_SYSTEM_ADDRESS, packet->guid, 7000); } else { PushMessage(RakNet::RakString("Punchthrough to ") + targetName + RakNet::RakString(" failed. Remote system should connect via proxy.")); } } break; case ID_NAT_PUNCHTHROUGH_SUCCEEDED: { unsigned char weAreSender=packet->data[1]; if (weAreSender) { PushMessage(RakNet::RakString("Punchthrough to ") + targetName + RakNet::RakString(" succeeded. Connecting.")); rakPeer->Connect(packet->systemAddress.ToString(false), packet->systemAddress.port,0,0); } else { PushMessage(RakNet::RakString("Punchthrough to ") + targetName + RakNet::RakString(" succeeded.")); } } break; case ID_ADVERTISE_SYSTEM: if (packet->guid!=rakPeer->GetGuidFromSystemAddress(UNASSIGNED_SYSTEM_ADDRESS)) { char hostIP[32]; packet->systemAddress.ToString(false,hostIP); rakPeer->Connect(hostIP,packet->systemAddress.port,0,0); } break; } } for (packet=tcpInterface->Receive(); packet; tcpInterface->DeallocatePacket(packet), packet=tcpInterface->Receive()) { httpConnection->ProcessTCPPacket(packet); } if (httpConnection->HasRead()) { RakNet::RakString httpResult = httpConnection->Read(); // Good response, let the PHPDirectoryServer2 class handle the data // If resultCode is not an empty string, then we got something other than a table // (such as delete row success notification, or the message is for HTTP only and not for this class). HTTPReadResult readResult = phpDirectoryServer2->ProcessHTTPRead(httpResult); if (readResult==HTTP_RESULT_GOT_TABLE) { /// Got a table which was stored internally. Print it out const DataStructures::Table *games = phpDirectoryServer2->GetLastDownloadedTable(); // __GAME_NAME is an automatic column passed to PHPDirectoryServer::UploadTable unsigned int gameNameIndex = games->ColumnIndex("__GAME_NAME"); // RakNetGUID is a column we manually added using our own GUID with PHPDirectoryServer::SetField // We need to use RakNetGUID because NAT punchthrough refers to systems by RakNetGUID, rather than by SystemAddress unsigned int guidIndex = games->ColumnIndex("RakNetGUID"); DataStructures::Table::Row *row; unsigned int i; unsigned int tableSize=0, connectionCount=0; DataStructures::Page<unsigned, DataStructures::Table::Row*, _TABLE_BPLUS_TREE_ORDER> *cur = games->GetRows().GetListHead(); while (cur) { for (i=0; i < (unsigned)cur->size; i++) { RakAssert(gameNameIndex!=-1); row = cur->data[i]; // Make sure it's the same game, since the PHPDirectoryServer can return other games too if (gameNameIndex!=-1 && strcmp(row->cells[gameNameIndex]->c, "IrrlichtDemo")==0) { tableSize++; RakNet::RakString guidStr = row->cells[guidIndex]->c; RakNetGUID guid; guid.FromString(guidStr.C_String()); // Connect as long as I'm not connecting to myself if (guid!=rakPeer->GetGuidFromSystemAddress(UNASSIGNED_SYSTEM_ADDRESS)) { connectionCount++; systemsToConnectTo.Push(guid); } } } cur=cur->next; } PushMessage(RakNet::RakString("DirectoryServer returned %i rows, of which we are connecting to %i",tableSize,connectionCount)); } } // Update our two classes so they can do time-based updates httpConnection->Update(); phpDirectoryServer2->Update(); // Start punchthrough to all pending systems, which we got from the PHP directory server code about 20 lines above if (isConnectedToNATPunchthroughServer) { while (systemsToConnectTo.GetSize()>0) { RakNetGUID g = systemsToConnectTo.Pop(__FILE__,__LINE__); natPunchthroughClient->OpenNAT(g, facilitatorSystemAddress); targetName=g.ToString(); PushMessage(RakNet::RakString("Punchthrough to ") + targetName + RakNet::RakString(" started.")); } } // Update non-plugin helper classes. // This keeps our system listed on the PHP directory server httpConnection->Update(); phpDirectoryServer2->Update(); // Call the Update function for networked game objects added to BaseIrrlichtReplica once the game is ready if (currentScene>=1) { DataStructures::DefaultIndexType idx; for (idx=0; idx < replicaManager3->GetReplicaCount(); idx++) ((BaseIrrlichtReplica*)(replicaManager3->GetReplicaAtIndex(idx)))->Update(curTime);; } }
bool ReadWriteDynQueue(const string &szIndex, const string &szDll, const string &szFunc, const char *pszQuery, const int &nSize, char *pBuffer, int &nRetSize, string szIDCUser = "******", string szAddr = "localhost") { static const string szLabel = "DYNPARAM"; static const string szDLLName = "DLL"; static const string szFUNC = "FUNC"; static const string szParam = "PARAMS"; static const char szSeparator = '#'; bool bRet = false; string szRefreshQueue(getRefreshQueueName(szIndex)), szQueueName(makeQueueName()); string szParamQueue(szQueueName + "_R"), szRetQueue(szQueueName + "_W"); CreateQueue(szRetQueue, 1, szIDCUser, szAddr); CreateQueue(szParamQueue, 1, szIDCUser, szAddr); CreateQueue(szRefreshQueue, 1, szIDCUser, szAddr); int nDllSize = static_cast<int>(szDll.size()) + 2, nFuncSize = static_cast<int>(szFunc.size()) + 2; char *pDll = new char[nDllSize]; if(pDll) { memset(pDll, 0, nDllSize); strcpy(pDll, szDll.c_str()); if(PushMessage(szParamQueue, szDLLName, pDll, nDllSize, szIDCUser, szAddr)) { char *pFunc = new char[nFuncSize]; if(pFunc) { memset(pFunc, 0, nFuncSize); strcpy(pFunc, szFunc.c_str()); if(PushMessage(szParamQueue, szFUNC, pFunc, nFuncSize, szIDCUser, szAddr)) { if(PushMessage(szParamQueue, szParam, pszQuery, nSize, szIDCUser, szAddr)) { int nQueueSize = static_cast<int>(szQueueName.size()) + 2; char *pszQueue = new char[nQueueSize]; if(pszQueue) { memset(pszQueue, 0, nQueueSize); strcpy(pszQueue, szQueueName.c_str()); if(PushMessage(szRefreshQueue, szLabel, pszQueue, nQueueSize, szIDCUser, szAddr)) { int nTimes = 0; while(!bRet) { if(nTimes >= 40) break; bRet = ReadFromRetQueue(szRetQueue, pBuffer, nRetSize, szIDCUser, szAddr); nTimes ++; } } delete []pszQueue; } } } delete []pFunc; } } delete []pDll; } DeleteQueue(szRetQueue, szIDCUser, szAddr); return bRet; }