Пример #1
0
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);

	}
Пример #2
0
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;
}
Пример #3
0
// -----------------------------------------------------------------------------
// 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 );
}
Пример #4
0
//! 压入一个定时消息
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;
}
Пример #5
0
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;
	}
Пример #6
0
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;
  }
Пример #7
0
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);
}
Пример #8
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);
}
Пример #9
0
void
CSelfNode::sendMessages()
{
	boost::lock_guard<boost::mutex> lock( m_mutex );

	if ( !m_messagesToSend.empty() )
		PushMessage("dims", m_messagesToSend);

	m_messagesToSend.clear();
}
Пример #10
0
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 );
    }
}
Пример #11
0
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);
}
Пример #12
0
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;
}
Пример #13
0
//============================================================
// <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;
}
Пример #14
0
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);
	}
Пример #15
0
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);
}
Пример #16
0
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);
    }
}
Пример #17
0
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 );
}
Пример #18
0
//
// 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);
}
Пример #19
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;
}
Пример #20
0
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)));
}
Пример #21
0
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)));
}
Пример #22
0
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;
		}
	}
Пример #23
0
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);
		}
	}
Пример #24
0
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)));
}
Пример #25
0
void CDemo::OnRecipientNotConnected(SystemAddress proxyCoordinator, SystemAddress sourceAddress, SystemAddress targetAddress, RakNetGUID targetGuid, RakNet::UDPProxyClient *proxyClientPlugin)
{
	PushMessage(RakNet::RakString("Failure: Recipient not connected to coordinator.\n"));
}
Пример #26
0
/// 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);;
	}	
}
Пример #27
0
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());
	}
Пример #28
0
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));
}
Пример #29
0
/// 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);;
	}	
}
Пример #30
0
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;
}