윈도우용 코드 완성
This commit is contained in:
2
.gitignore
vendored
2
.gitignore
vendored
@@ -1 +1,3 @@
|
||||
build/*
|
||||
out
|
||||
.vs
|
||||
@@ -33,9 +33,12 @@ add_executable(${PROJECT_NAME}
|
||||
)
|
||||
target_link_libraries(${PROJECT_NAME} PRIVATE Microsoft.GSL::GSL)
|
||||
target_link_libraries(${PROJECT_NAME} PRIVATE spdlog)
|
||||
target_link_libraries(${PROJECT_NAME} PRIVATE ws2_32)
|
||||
|
||||
target_include_directories(${PROJECT_NAME} PUBLIC
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/../include
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/include
|
||||
)
|
||||
target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_20)
|
||||
|
||||
target_precompile_headers(${PROJECT_NAME} PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../include/precomp.hpp")
|
||||
@@ -1,6 +1,8 @@
|
||||
#include <iostream>
|
||||
#include "Socket/Error.hpp"
|
||||
#include "Socket/Socket_Init.hpp"
|
||||
#include "precomp.hpp"
|
||||
|
||||
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;
|
||||
}
|
||||
@@ -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
50
impl/Socket/Log.cpp
Normal 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
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,11 +1,29 @@
|
||||
#include "Socket/Socket_Init.hpp"
|
||||
#include "Socket/Log.hpp"
|
||||
#include "precomp.hpp"
|
||||
|
||||
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() {
|
||||
#ifdef _WIN32
|
||||
closesocket(sock_);
|
||||
WSACleanup();
|
||||
#elif __linux__
|
||||
close(sock_);
|
||||
#endif
|
||||
}
|
||||
|
||||
SOCKET Socket_Init::get() const { return sock_; }
|
||||
|
||||
}
|
||||
@@ -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
7
include/Socket/Log.hpp
Normal file
@@ -0,0 +1,7 @@
|
||||
#pragma once
|
||||
#include "precomp.hpp"
|
||||
|
||||
namespace Chattr::log {
|
||||
void critical(gsl::czstring msg);
|
||||
void error(gsl::czstring msg);
|
||||
}
|
||||
@@ -1,18 +1,19 @@
|
||||
#pragma once
|
||||
|
||||
#ifdef _WIN32
|
||||
|
||||
#elif __linux__
|
||||
|
||||
#else
|
||||
#error "이 플랫폼은 지원되지 않습니다."
|
||||
#endif
|
||||
#include "precomp.hpp"
|
||||
|
||||
namespace Chattr {
|
||||
|
||||
struct Socket_Init {
|
||||
Socket_Init();
|
||||
public:
|
||||
Socket_Init(std::int32_t domain, std::int32_t type, std::int32_t protocol);
|
||||
~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
14
include/precomp.hpp
Normal 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>
|
||||
Reference in New Issue
Block a user