void process(processArgs args) { bool response; unsigned char* buf; ssize_t* cnt; std::string sql; DB *db; if (args.end == 1) { return; } Pool::set(4); db = Pool::get(); if (db == NULL) { return; } response = false; buf = args.buf; cnt = args.cnt; LPPACKET packet = (LPPACKET)buf; PACKET sndPacket; unsigned char type = buf[1]; unsigned char* unions = NULL; Logger::log(Logger::DEBUG, "messages: {length: %d, type: %d}", packet->m_basicMsg.m_length, packet->m_basicMsg.m_type); //printf("[TCP 서버] 클라이언트 접속 : IP주소 = %s, 포트번호 = %d\n", inet_ntoa(clientaddr.sin_addr), ntohs(clientaddr.sin_port)); switch( type ) { case SD_CHAT_IP: // 채팅서버 아이피 { if (myUTIL::strLen(server_ips.m_chat) < 7) { if (myUTIL::strLen(packet->m_ipAddress.m_ip) >= 7) { myUTIL::strCopy(server_ips.m_chat, packet->m_ipAddress.m_ip); Logger::log(Logger::DEBUG, "set chat ip : %s", packet->m_ipAddress.m_ip); server_ips_index[0] = args.evt; } else { Logger::log(Logger::DEBUG, "can't set chat ip : %s", packet->m_ipAddress.m_ip); } } else { Logger::log(Logger::DEBUG, "get chat ip : %s", server_ips.m_chat); } if (myUTIL::strLen(server_ips.m_chat) >= 7 && myUTIL::strLen(server_ips.m_game) >= 7 && myUTIL::strLen(server_ips.m_lobby) >= 7) { unions = reinterpret_cast<unsigned char *>(&server_ips); *cnt = sizeof(SERVER_IP); //response = true; processSendServerIP(unions, cnt); } } break; case SD_GAME_IP: // 게임서버 아이피 { if (myUTIL::strLen(server_ips.m_game) < 7) { if (myUTIL::strLen(packet->m_ipAddress.m_ip) >= 7) { myUTIL::strCopy(server_ips.m_game, packet->m_ipAddress.m_ip); Logger::log(Logger::DEBUG, "set game ip : %s", packet->m_ipAddress.m_ip); server_ips_index[1] = args.evt; } else { Logger::log(Logger::DEBUG, "can't set game ip : %s", packet->m_ipAddress.m_ip); } } else { Logger::log(Logger::DEBUG, "get game ip : %s", server_ips.m_game); } if (myUTIL::strLen(server_ips.m_chat) >= 7 && myUTIL::strLen(server_ips.m_game) >= 7 && myUTIL::strLen(server_ips.m_lobby) >= 7) { unions = reinterpret_cast<unsigned char *>(&server_ips); *cnt = sizeof(SERVER_IP); //response = true; processSendServerIP(unions, cnt); } } break; case SD_LOBBY_IP: // 로비서버 아이피 { if (myUTIL::strLen(server_ips.m_lobby) < 7) { if (myUTIL::strLen(packet->m_ipAddress.m_ip) >= 7) { myUTIL::strCopy(server_ips.m_lobby, packet->m_ipAddress.m_ip); Logger::log(Logger::DEBUG, "set lobby ip : %s", packet->m_ipAddress.m_ip); server_ips_index[2] = args.evt; } else { Logger::log(Logger::DEBUG, "can't set lobby ip : %s", packet->m_ipAddress.m_ip); } } else { Logger::log(Logger::DEBUG, "get lobby ip : %s", server_ips.m_lobby); } if (myUTIL::strLen(server_ips.m_chat) >= 7 && myUTIL::strLen(server_ips.m_game) >= 7 && myUTIL::strLen(server_ips.m_lobby) >= 7) { unions = reinterpret_cast<unsigned char *>(&server_ips); *cnt = sizeof(SERVER_IP); //response = true; processSendServerIP(unions, cnt); } } break; /* case SD_CHAT_IP_REQ: // 채팅서버 아이피 요청 { ip_address[0].m_length = sizeof(IP_ADDRESS); ip_address[0].m_type = DS_CHAT_IP; unions = reinterpret_cast<unsigned char *>(&ip_address[0]); *cnt = sizeof(IP_ADDRESS); } break; case SD_GAME_IP_REQ: // 게임서버 아이피 요청 { ip_address[1].m_length = sizeof(IP_ADDRESS); ip_address[1].m_type = DS_GAME_IP; unions = reinterpret_cast<unsigned char *>(&ip_address[1]); *cnt = sizeof(IP_ADDRESS); } break; case SD_LOBBY_IP_REQ: // 로비서버 아이피 요청 { ip_address[2].m_length = sizeof(IP_ADDRESS); ip_address[2].m_type = DS_LOBBY_IP; unions = reinterpret_cast<unsigned char *>(&ip_address[2]); *cnt = sizeof(IP_ADDRESS); } break; */ case SD_JOIN: { Logger::log(Logger::DEBUG, "ID : %s", packet->m_loginReq.m_id); Logger::log(Logger::DEBUG, "PW : %s", packet->m_loginReq.m_pw); if (myUTIL::strLen(packet->m_loginReq.m_id) > 0 && myUTIL::strLen(packet->m_loginReq.m_id) > 0) { sql.erase(); sql.append("SELECT no FROM users WHERE id='").append(packet->m_loginReq.m_id).append("'"); db->select(sql.c_str()); if (!db->errorCode()) { if (db->rowCount() == 0) { sql.erase(); sql.append("INSERT INTO users (id, pw) VALUES ("); sql.append(" '").append(packet->m_loginReq.m_id).append("'"); sql.append(" ,'").append(packet->m_loginReq.m_pw).append("'"); sql.append(")"); int rst = db->dml(sql.c_str()); if (rst > 0) { db->commit(); Logger::log(Logger::DEBUG, "%s", "JOIN ... success"); sndPacket.m_sendUserIndex.m_length = sizeof(SEND_USERINDEX); sndPacket.m_sendUserIndex.m_type = DS_JOIN; sndPacket.m_sendUserIndex.m_idx = packet->m_loginReq.m_idx; unions = reinterpret_cast<unsigned char *>(&sndPacket.m_sendUserIndex); *cnt = sizeof(SEND_USERINDEX); response = true; } else { db->rollback(); Logger::log(Logger::ERROR, "%d : %s", db->errorCode(), db->errorMessage()); } } else { Logger::log(Logger::DEBUG, "%s", "JOIN ... failure"); sndPacket.m_sendUserIndex.m_length = sizeof(SEND_USERINDEX); sndPacket.m_sendUserIndex.m_type = DS_JOIN_FAIL; sndPacket.m_sendUserIndex.m_idx = packet->m_loginReq.m_idx; unions = reinterpret_cast<unsigned char *>(&sndPacket.m_sendUserIndex); *cnt = sizeof(SEND_USERINDEX); response = true; } } else { Logger::log(Logger::ERROR, "%d : %s", db->errorCode(), db->errorMessage()); } } else { Logger::log(Logger::DEBUG, "%s", "JOIN ... failure - ID or PW is empty"); sndPacket.m_sendUserIndex.m_length = sizeof(SEND_USERINDEX); sndPacket.m_sendUserIndex.m_type = DS_JOIN_FAIL; sndPacket.m_sendUserIndex.m_idx = packet->m_loginReq.m_idx; unions = reinterpret_cast<unsigned char *>(&sndPacket.m_sendUserIndex); *cnt = sizeof(SEND_USERINDEX); response = true; } } break; case SD_LOGIN: { Logger::log(Logger::DEBUG, "ID : %s", packet->m_loginReq.m_id); Logger::log(Logger::DEBUG, "PW : %s", packet->m_loginReq.m_pw); if (myUTIL::strLen(packet->m_loginReq.m_id) > 0 && myUTIL::strLen(packet->m_loginReq.m_pw) > 0) { sql.erase(); sql.append("SELECT no FROM users WHERE id='").append(packet->m_loginReq.m_id).append("'"); db->select(sql.c_str()); if (!db->errorCode()) { if (db->rowCount() == 0) { Logger::log(Logger::DEBUG, "%s", "LOGIN ... user isn't exists"); sndPacket.m_sendUserIndex.m_length = sizeof(SEND_USERINDEX); sndPacket.m_sendUserIndex.m_type = DS_LOGIN_FAIL_ID; sndPacket.m_sendUserIndex.m_idx = packet->m_loginReq.m_idx; unions = reinterpret_cast<unsigned char *>(&sndPacket.m_sendUserIndex); *cnt = sizeof(SEND_USERINDEX); response = true; } else { sql.erase(); sql.append("SELECT no FROM users WHERE "); sql.append(" id='").append(packet->m_loginReq.m_id).append("'"); sql.append(" AND pw='").append(packet->m_loginReq.m_pw).append("'"); Row* rows = db->select(sql.c_str()); if (!db->errorCode()) { if (db->rowCount() == 1) { //printf(">>> %s <<<\n", rows[0].data[0].data); Logger::log(Logger::DEBUG, "%s", "LOGIN ... success"); sndPacket.m_sendUserKey.m_length = sizeof(SEND_USERKEY); sndPacket.m_sendUserKey.m_type = DS_LOGIN; sndPacket.m_sendUserKey.m_idx = packet->m_loginReq.m_idx; sndPacket.m_sendUserKey.m_no = static_cast<unsigned int>(atoi(rows[0].data[0].data)); unions = reinterpret_cast<unsigned char *>(&sndPacket.m_sendUserKey); *cnt = sizeof(SEND_USERKEY); response = true; } else { Logger::log(Logger::DEBUG, "%s", "LOGIN ... failure"); sndPacket.m_sendUserIndex.m_length = sizeof(SEND_USERINDEX); sndPacket.m_sendUserIndex.m_type = DS_LOGIN_FAIL_PW; sndPacket.m_sendUserIndex.m_idx = packet->m_loginReq.m_idx; unions = reinterpret_cast<unsigned char *>(&sndPacket.m_sendUserIndex); *cnt = sizeof(SEND_USERINDEX); response = true; } } else { Logger::log(Logger::ERROR, "%d : %s", db->errorCode(), db->errorMessage()); } } } else { Logger::log(Logger::ERROR, "%d : %s", db->errorCode(), db->errorMessage()); } } else { Logger::log(Logger::DEBUG, "%s", "LOGIN ... failure - ID or PW is empty"); sndPacket.m_basicMsg.m_length = sizeof(BASIC_MSG); sndPacket.m_basicMsg.m_type = DS_LOGIN_FAIL_ID; unions = reinterpret_cast<unsigned char *>(&sndPacket.m_basicMsg); *cnt = sizeof(BASIC_MSG); response = true; } } break; case SD_PLAYER_INFO: { /* PACKET newPacket; newPacket.m_sendUserKey.m_type = SD_PLAYER_INFO; newPacket.m_sendUserKey.m_length = sizeof(SEND_USERKEY); newPacket.m_sendUserKey.m_no = packet->m_sendUserInfo.m_user.m_no; newPacket.m_sendUserKey.m_idx = pClientInfo->m_index; m_pServer->sendPacket(m_pServer->getDBInfo(), (unsigned char *)&newPacket); */ Logger::log(Logger::DEBUG, "SD_PLAYER_INFO : user no - %d", packet->m_sendUserKey.m_no); sql.erase(); sql.append("SELECT "); sql.append(" u.no "); sql.append(", u.id "); sql.append(", IFNULL(uc.lv, 0) lv "); sql.append(", IFNULL(uc.hp, 0) hp "); sql.append(", IFNULL(uc.mp, 0) mp "); sql.append(", IFNULL(uc.sp, 0) sp "); sql.append(", IFNULL(uc.sk, 0) sk "); sql.append(", IFNULL(uc.last_maps_no, 0) last_maps_no "); sql.append(", IFNULL(uc.last_maps_x, 0) last_maps_x "); sql.append(", IFNULL(uc.last_maps_y, 0) last_maps_y "); sql.append("FROM "); sql.append("users u LEFT JOIN users_chars uc ON uc.users_no = u.no WHERE u.no = "); char buffer[12]; sql.append(myUTIL::strFromInt(packet->m_sendUserKey.m_no, buffer)); //Logger::log(Logger::DEBUG, "sql : %s", sql.c_str()); Row* rows = db->select(sql.c_str()); if (!db->errorCode()) { if (db->rowCount() == 1) { //rows[0].data[0]: no //rows[0].data[1]: id //rows[0].data[2]: lv //rows[0].data[3]: hp //rows[0].data[4]: mp //rows[0].data[5]: sp //rows[0].data[6]: sk //rows[0].data[7]: last_maps_no //rows[0].data[8]: last_maps_x //rows[0].data[9]: last_maps_y Logger::log(Logger::DEBUG, "%s", "SD_PLAYER_INFO -> DS_PLAYER_INFO"); sndPacket.m_characterInfo.m_length = sizeof(CHARACTER_INFO); sndPacket.m_characterInfo.m_type = DS_PLAYER_INFO; sndPacket.m_characterInfo.m_idx = packet->m_sendUserKey.m_idx; sndPacket.m_characterInfo.m_pcInfo.m_idx = packet->m_sendUserKey.m_idx; sndPacket.m_characterInfo.m_pcInfo.m_lv = atoi(rows[0].data[2].data); sndPacket.m_characterInfo.m_pcInfo.m_hp = atoi(rows[0].data[3].data); sndPacket.m_characterInfo.m_pcInfo.m_mp = atoi(rows[0].data[4].data); sndPacket.m_characterInfo.m_pcInfo.m_sp = atoi(rows[0].data[5].data); sndPacket.m_characterInfo.m_pcInfo.m_sk = atoi(rows[0].data[6].data); sndPacket.m_characterInfo.m_pcInfo.m_pos.x = atoi(rows[0].data[8].data); sndPacket.m_characterInfo.m_pcInfo.m_pos.y = atoi(rows[0].data[9].data); unions = reinterpret_cast<unsigned char *>(&sndPacket.m_characterInfo); *cnt = sizeof(CHARACTER_INFO); response = true; } else { Logger::log(Logger::DEBUG, "there are no results (rows : %d)", db->rowCount()); } } else { Logger::log(Logger::ERROR, "%d : %s", db->errorCode(), db->errorMessage()); } } break; default: Logger::log(Logger::DEBUG, "no definitions"); } Pool::release(db); if (response == true && unions != NULL) { memcpy(args.buf, unions, *args.cnt); processCallBack(args); } }