Esempio n. 1
0
int CNodeMgr::addNode(char* p_addr, char* p_name, bool p_busy, bool p_needUHP)
{
	/* 外で排他かけること!! */

	/* 簡単に書式チェック */
	char* p = p_addr;
	if (strlen(p_addr) == 0)			return -1;
	if ((p = strchr(p+1, '.')) == NULL) return -1;
	if ((p = strchr(p+1, '.')) == NULL) return -1;
	if ((p = strchr(p+1, '.')) == NULL) return -1;
	if ((p = strchr(p+1, ':')) == NULL) return -1;

	// 自分は無視するm_ownNodeが未取得ならやはり無視
	if (useLobbyServer())
	{
		char* pos = strchr(m_ownNode, ':');
		if (m_ownNode[0] == '\0' || strncmp(m_ownNode, p_addr, (int)(pos - p_addr)) == 0) return -1;
	}

	int idx = -1;
	// UNKNOWN_NAMEは無条件に不一致とする
	if (strncmp(p_name, UNKNOWN_NAME, sizeof(UNKNOWN_NAME)) != 0)
	{
		sockaddr_in addr = g_netMgr->getAddrFromString(p_addr);
		idx = findNodeIdx_name_ip(p_name, addr.sin_addr.S_un.S_addr);
	}

	if (idx == -1)
	{
		//DBGOUT_NET("addNode %s:%s\n", p_name, p_addr);

		/* 重複していなければ追加 */
		CNode node;
		__strncpy(node.m_addr, p_addr, 31);
		__strncpy(node.m_name, p_name, 29);
		node.m_state		= p_busy ? State_Busy : State_NoResponse;
		node.m_ex			= 0;
		node.m_rank			= Rank_F;
		node.m_delay		= 0;
		node.m_win			= 0;
		node.m_ignoreSlow	= 1;
		node.m_round		= 0;
		node.m_deny			= true;
		node.m_needDetail	= true;
		node.m_gamecount	= 0;
		node.m_scriptCode	= 0;
		
		node.m_allowIntrusion	= false;
		node.m_watchMaxNode		= -16;
		node.m_galleryCount		= 0;
		node.m_galleryUpdateTime= timeGetTime();
		
		/* 定期的に他のノードにポートの拡散を依頼する */
		node.m_uhpNodeIdx	= 0;

		__strncpy(node.m_ver, "----", 9);
		memcpy(node.m_id, INVALID_MID, sizeof(INVALID_MID));
		memset(node.m_msg, 0, 256);
		node.clearBattleInfo();
		
		node.m_validInfo = 0x00000000;

		node.clearPing();

		m_nodeList.add(node);

		CNode* newnode = &m_nodeList[m_nodeList.size() - 1];
		newnode->m_tmpaddr.add(new char[32]);
		__strncpy(newnode->m_tmpaddr[newnode->m_tmpaddr.size() - 1], p_addr, 31);

		return (m_nodeList.size() - 1);
	}
	else
	{
		if (findNodeIdx_address(p_addr) == -1)
		{
			// ポートを追加
			m_nodeList[idx].m_tmpaddr.add(new char[32]);
			__strncpy(m_nodeList[idx].m_tmpaddr[m_nodeList[idx].m_tmpaddr.size() - 1], p_addr, 31);
			// return idx; //新規追加ではないのでidxを返してはいけない
			//DBGOUT_NET("addNode : multi port %s:%s\n", p_name, p_addr);
		}
		//else DBGOUT_NET("addNode : duplicate error %s:%s\n", p_name, p_addr);
	}

	return -1;
}