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; }