카테고리 없음

댕팡 - 서버 코드

joo_coding 2025. 5. 31. 20:06

server3.cpp
0.01MB

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