윈도우용 코드 완성

This commit is contained in:
2025-04-21 21:52:33 +09:00
parent c81197054d
commit a464fdfe82
11 changed files with 111 additions and 59 deletions

4
.gitignore vendored
View File

@@ -1 +1,3 @@
build/* build/*
out
.vs

View File

@@ -33,9 +33,12 @@ add_executable(${PROJECT_NAME}
) )
target_link_libraries(${PROJECT_NAME} PRIVATE Microsoft.GSL::GSL) target_link_libraries(${PROJECT_NAME} PRIVATE Microsoft.GSL::GSL)
target_link_libraries(${PROJECT_NAME} PRIVATE spdlog) target_link_libraries(${PROJECT_NAME} PRIVATE spdlog)
target_link_libraries(${PROJECT_NAME} PRIVATE ws2_32)
target_include_directories(${PROJECT_NAME} PUBLIC target_include_directories(${PROJECT_NAME} PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/../include ${CMAKE_CURRENT_SOURCE_DIR}/../include
${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/include
) )
target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_20) target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_20)
target_precompile_headers(${PROJECT_NAME} PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../include/precomp.hpp")

View File

@@ -1,6 +1,8 @@
#include <iostream> #include <iostream>
#include "Socket/Error.hpp" #include "Socket/Socket_Init.hpp"
#include "precomp.hpp"
int main() { int main() {
std::cout << "Hello, world!" << std::endl; struct Chattr::Socket_Init socket(AF_INET, SOCK_STREAM, 0);
std::cout << "Hello, world!" << socket.get() << std::endl;
} }

View File

@@ -1,29 +0,0 @@
#include "Socket/Error.hpp"
#include "spdlog/spdlog.h"
namespace Chattr::error {
void critical(gsl::czstring msg) {
#ifdef _WIN32
//TODO 윈도우에서 구현할 것
#elif __linux__
gsl::czstring msgbuf = strerror(errno);
#else
#error "이 플랫폼은 지원되지 않습니다."
#endif
spdlog::critical(msgbuf);
std::exit(EXIT_FAILURE);
}
void error(gsl::czstring msg) {
#ifdef _WIN32
//TODO 윈도우에서 구현할 것
#elif __linux__
gsl::czstring msgbuf = strerror(errno);
#else
#error "이 플랫폼은 지원되지 않습니다."
#endif
spdlog::error(msgbuf);
}
}

50
impl/Socket/Log.cpp Normal file
View File

@@ -0,0 +1,50 @@
#include "Socket/Log.hpp"
#include "precomp.hpp"
#include "spdlog/spdlog.h"
namespace Chattr::log {
void critical(gsl::czstring msg) {
#ifdef _WIN32
gsl::zstring msgbuf = nullptr;
FormatMessageA(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
WSAGetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
msgbuf,
0,
NULL);
spdlog::critical("[{}] {}", msg, msgbuf);
LocalFree(msgbuf);
#elif __linux__
gsl::czstring msgbuf = strerror(errno);
spdlog::critical("[{}] {}", msg, msgbuf);
#else
#error "이 플랫폼은 지원되지 않습니다."
#endif
std::exit(EXIT_FAILURE);
}
void error(gsl::czstring msg) {
#ifdef _WIN32
gsl::zstring msgbuf = nullptr;
FormatMessageA(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
WSAGetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
msgbuf,
0,
NULL);
spdlog::error("[{}] {}", msg, msgbuf);
LocalFree(msgbuf);
#elif __linux__
gsl::czstring msgbuf = strerror(errno);
spdlog::error("[{}] {}", msg, msgbuf);
#else
#error "이 플랫폼은 지원되지 않습니다."
#endif
}
}

View File

@@ -1,11 +1,29 @@
#include "Socket/Socket_Init.hpp" #include "Socket/Socket_Init.hpp"
#include "Socket/Log.hpp"
#include "precomp.hpp"
namespace Chattr { namespace Chattr {
Socket_Init::Socket_Init() { Socket_Init::Socket_Init(std::int32_t domain, std::int32_t type, std::int32_t protocol) {
#ifdef _WIN32
WSADATA wsa;
if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
log::critical("WSAStartup()");
#endif
sock_ = socket(domain, type, protocol);
if (sock_ == INVALID_SOCKET)
log::critical("socket()");
} }
Socket_Init::~Socket_Init() { Socket_Init::~Socket_Init() {
#ifdef _WIN32
closesocket(sock_);
WSACleanup();
#elif __linux__
close(sock_);
#endif
} }
SOCKET Socket_Init::get() const { return sock_; }
} }

View File

View File

@@ -1,16 +0,0 @@
#pragma once
#ifdef _WIN32
#include <winsock2.h>
#elif __linux__
#include <errno.h>
#else
#error "이 플랫폼은 지원되지 않습니다."
#endif
#include <gsl/gsl>
namespace Chattr::error {
void critical(gsl::czstring msg);
void error(gsl::czstring msg);
}

7
include/Socket/Log.hpp Normal file
View File

@@ -0,0 +1,7 @@
#pragma once
#include "precomp.hpp"
namespace Chattr::log {
void critical(gsl::czstring msg);
void error(gsl::czstring msg);
}

View File

@@ -1,18 +1,19 @@
#pragma once #pragma once
#include "precomp.hpp"
#ifdef _WIN32
#elif __linux__
#else
#error "이 플랫폼은 지원되지 않습니다."
#endif
namespace Chattr { namespace Chattr {
struct Socket_Init { struct Socket_Init {
Socket_Init(); public:
Socket_Init(std::int32_t domain, std::int32_t type, std::int32_t protocol);
~Socket_Init(); ~Socket_Init();
Socket_Init(const Socket_Init&) = delete;
Socket_Init& operator=(const Socket_Init&) = delete;
SOCKET get() const;
private:
SOCKET sock_;
}; };
} }

14
include/precomp.hpp Normal file
View File

@@ -0,0 +1,14 @@
#pragma once
#ifdef _WIN32
#include <winsock2.h>
#include <windows.h>
#elif __linux__
#include <errno.h>
#define SOCKET std::int32_t
#define INVALID_SOCKET -1
#else
#error "<22><> <20>÷<EFBFBD><C3B7><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>."
#endif
#include <gsl/gsl>