카테고리 없음
댕팡 - 서버 코드
joo_coding
2025. 5. 31. 20:06
server.cpp
#include <iostream>
#include <string>
#include <cstring>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <mysql/mysql.h>
#include "json.hpp"
#include <thread>
using json = nlohmann::json;
using namespace std;
const char* HOST = "10.10.20.111";
const char* USER = "dangdang";
const char* PASS = "1234";
const char* DB = "DANG";
constexpr int PORT = 9957;
constexpr int BUFFER_SIZE = 1024;
// DB 연결
MYSQL* connect_db() {
MYSQL* conn = mysql_init(nullptr);
if (!mysql_real_connect(conn, HOST, USER, PASS, DB, 0, NULL, 0)) {
cerr << "DB 연결 실패: " << mysql_error(conn) << endl;
return nullptr;
}
cout << "DB 연결 성공" << endl;
return conn;
}
json handle_dog_list(int user_id) {
json result;
MYSQL* conn = connect_db();
if (!conn) {
result["status"] = "error";
result["message"] = "DB 연결 실패";
return result;
}
string query = "SELECT dog_id, name, breed, birthdate, weight FROM dog WHERE user_id = " + to_string(user_id);
if (mysql_query(conn, query.c_str())) {
result["status"] = "error";
result["message"] = mysql_error(conn);
mysql_close(conn);
return result;
}
MYSQL_RES* res = mysql_store_result(conn);
MYSQL_ROW row;
json dog_list = json::array();
while ((row = mysql_fetch_row(res))) {
json dog = {
{"dog_id", stoi(row[0])},
{"name", row[1]},
{"breed", row[2]},
{"birthdate", row[3]},
{"weight", row[4] ? stof(row[4]) : 0.0f}
};
dog_list.push_back(dog);
}
mysql_free_result(res);
mysql_close(conn);
result["status"] = "success";
result["data"]["dog_list"] = dog_list;
return result;
}
json handle_signup(const json& data) {
json result;
if (!data.contains("USER_ID") || !data.contains("USER_PW") || !data.contains("USER_NAME") || !data.contains("USER_PHONE") || !data.contains("USER_ROLE")) {
result["status"] = "error";
result["message"] = "필수 필드 누락";
return result;
}
string USER_ID = data["USER_ID"];
string USER_NAME = data["USER_NAME"];
string USER_PW = data["USER_PW"];
string USER_PHONE = data["USER_PHONE"];
int USER_ROLE = data["USER_ROLE"];
string USER_CREATE_DATE = data["USER_CREATE_DATE"];
MYSQL* conn = connect_db();
if (!conn) {
result["status"] = "error";
result["message"] = "DB 연결 실패";
return result;
}
string check_query = "SELECT * FROM USER_INFO WHERE USER_ID='" + USER_ID + "'";
mysql_query(conn, check_query.c_str());
MYSQL_RES* exists = mysql_store_result(conn);
if (mysql_num_rows(exists) > 0) {
result["status"] = "fail";
result["message"] = "이미 존재하는 사용자입니다.";
mysql_free_result(exists);
mysql_close(conn);
return result;
}
mysql_free_result(exists);
string insert_query = "INSERT INTO USER_INFO (USER_ID, USER_NAME, USER_PW, USER_PHONE, USER_ROLE , USER_CREATE_DATE) VALUES ('"
+ USER_ID +"' , '"
+ USER_NAME + "', '"
+ USER_PW + "', '"
+ USER_PHONE + "', "
+ to_string(USER_ROLE) +" ,'"
+ USER_CREATE_DATE +"')";
if (mysql_query(conn, insert_query.c_str())) {
result["status"] = "error";
result["message"] = mysql_error(conn);
mysql_close(conn);
return result;
}
result["status"] = "success";
result["message"] = "회원가입 성공";
mysql_close(conn);
return result;
}
json handle_signup_company(const json& data) {
json result;
if (!data.contains("CP_TYPE") || !data.contains("CP_NAME") || !data.contains("CP_ADDRESS") || !data.contains("CP_TIME")
|| !data.contains("CP_CLOSE_DAY") || !data.contains("CP_PHONE") || !data.contains("CP_ANNOUNCEMENT") || !data.contains("CP_BUSINESS_NUM")
|| !data.contains("CP_OWNER_NAME") || !data.contains("CP_OWNER_PHONE") || !data.contains("CP_OWNER_ID") || !data.contains("CP_OWNER_PW")) {
result["status"] = "error";
result["message"] = "필수 필드 누락";
return result;
}
string CP_TYPE = data["CP_TYPE"];
string CP_NAME = data["CP_NAME"];
string CP_ADDRESS = data["CP_ADDRESS"];
string CP_TIME = data["CP_TIME"];
string CP_CLOSE_DAY = data["CP_CLOSE_DAY"];
string CP_PHONE = data["CP_PHONE"];
string CP_ANNOUNCEMENT = data["CP_ANNOUNCEMENT"];
string CP_BUSINESS_NUM = data["CP_BUSINESS_NUM"];
string CP_OWNER_NAME = data["CP_OWNER_NAME"];
string CP_OWNER_PHONE = data["CP_OWNER_PHONE"];
string CP_OWNER_ID = data["CP_OWNER_ID"];
string CP_OWNER_PW = data["CP_OWNER_PW"];
MYSQL* conn = connect_db();
if (!conn) {
result["status"] = "error";
result["message"] = "DB 연결 실패";
return result;
}
string check_query = "SELECT * FROM COMPANY_INFO WHERE CP_BUSINESS_NUM='" + CP_BUSINESS_NUM + "'";
mysql_query(conn, check_query.c_str());
MYSQL_RES* exists = mysql_store_result(conn);
if (mysql_num_rows(exists) > 0) {
result["status"] = "fail";
result["message"] = "이미 존재하는 사용자입니다.";
mysql_free_result(exists);
mysql_close(conn);
return result;
}
mysql_free_result(exists);
string insert_query = "INSERT INTO COMPANY_INFO (CP_TYPE, CP_NAME, CP_ADDRESS, CP_TIME, CP_CLOSE_DAY , CP_PHONE , CP_ANNOUNCEMENT, CP_BUSINESS_NUM , CP_OWNER_NAME , CP_OWNER_PHONE , CP_OWNER_ID , CP_OWNER_PW) VALUES ('"
+ CP_TYPE +"' , '"
+ CP_NAME + "', '"
+ CP_ADDRESS + "', '"
+ CP_TIME + "', '"
+ CP_CLOSE_DAY + "', "
+ CP_PHONE +" ,'"
+ CP_ANNOUNCEMENT +"' , '"
+ CP_BUSINESS_NUM +"' , '"
+ CP_OWNER_NAME +"', '"
+ CP_OWNER_PHONE +"' , '"
+ CP_OWNER_ID +"' , '"
+ CP_OWNER_PW +"')";
if (mysql_query(conn, insert_query.c_str())) {
result["status"] = "error";
result["message"] = mysql_error(conn);
mysql_close(conn);
return result;
}
result["status"] = "success";
result["message"] = "회원가입 성공";
mysql_close(conn);
return result;
}
json handle_login(const json& data) {
json result;
if (!data.contains("USER_ID") || !data.contains("USER_PW")) {
result["status"] = "error";
result["message"] = "필수 필드 누락";
return result;
}
string USER_ID = data["USER_ID"];
string USER_PW = data["USER_PW"];
MYSQL* conn = connect_db();
if (!conn) {
result["status"] = "error";
result["message"] = "DB 연결 실패";
return result;
}
string query = "SELECT USER_ID, USER_ROLE FROM USER_INFO WHERE USER_NAME='" + USER_ID + "' AND password='" + USER_PW + "'";
if (mysql_query(conn, query.c_str())) {
result["status"] = "error";
result["message"] = mysql_error(conn);
mysql_close(conn);
return result;
}
MYSQL_RES* res = mysql_store_result(conn);
MYSQL_ROW row = mysql_fetch_row(res);
if (!row) {
result["status"] = "fail";
result["message"] = "아이디 또는 비밀번호 오류";
} else {
result["status"] = "success";
result["message"] = "로그인 성공";
result["user_id"] = row[0];
result["role"] = row[1];
}
mysql_free_result(res);
mysql_close(conn);
return result;
}
void handle_client(int client_socket){
while (true) {
char buffer[BUFFER_SIZE];
memset(buffer, 0, BUFFER_SIZE);
int valread = read(client_socket, buffer, BUFFER_SIZE);
if (valread <= 0) {
cout << "클라이언트 연결 종료됨." << endl;
break;
}
string received_data(buffer, valread);
cout << "받은 데이터: " << received_data << endl;
try {
json request = json::parse(received_data);
if (!request.contains("action") || !request.contains("data")) {
cerr << "유효하지 않은 요청." << endl;
continue;
}
string action = request["action"];
json data = request["data"];
json response;
if (action == "dog_list") {
response = handle_dog_list(data["user_id"]);
} else if (action == "signup") {
response = handle_signup(data);
} else if (action == "signup2") {
response = handle_signup_company(data);
}else if (action == "login") {
response = handle_login(data);
} else {
response = {
{"status", "error"},
{"message", "알 수 없는 action"}
};
}
string response_str = response.dump();
send(client_socket, response_str.c_str(), response_str.size(), 0);
} catch (const exception& e) {
cerr << "JSON 파싱 오류: " << e.what() << endl;
}
}
close(client_socket);
}
int main() {
int server_fd, new_socket;
struct sockaddr_in address{};
int addrlen = sizeof(address);
char buffer[BUFFER_SIZE] = {0};
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("socket failed"); return 1;
}
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(PORT);
if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
perror("bind failed"); return 1;
}
if (listen(server_fd, 3) < 0) {
perror("listen"); return 1;
}
cout << "서버 대기 중... 포트 " << PORT << endl;
while (true) {
new_socket = accept(server_fd, (struct sockaddr*)&address, (socklen_t*)&addrlen);
if (new_socket < 0) {
perror("accept"); continue;
}
cout << "클라이언트 연결됨!" << endl;
thread t(handle_client, new_socket);
t.detach();
}
close(server_fd);
return 0;
}