udp/tcp 비동기 통신은 현재 가능

This commit is contained in:
2025-06-08 01:11:23 +09:00
parent 5fdae769e2
commit 5ba62b5312
7 changed files with 251 additions and 89 deletions

View File

@@ -7,104 +7,143 @@
#include "socket/udp_socket.h"
#include "socket/wsa_manager.h"
#include "utils/log.h"
#include "utils/snowflake.h"
#include "vulkan_engine/vulkan/engine.h"
#include "vulkan_engine/vulkan/graphics.h"
std::int32_t main(std::int32_t argc, gsl::zstring* argv) {
std::int32_t main(std::int32_t argc, gsl::zstring* argv) {
Network::WSAManager wsamanager;
#if !defined(NDEBUG)
utils::setDefaultLogger(spdlog::level::level_enum::debug, "log.log", 1024,
2);
#endif
utils::ThreadPool tp(0);
Network::IOCP iocp;
iocp.init(&tp, SessionProtocol::TCP);
#if !defined(NDEBUG)
utils::setDefaultLogger(spdlog::level::level_enum::debug, "log.log", 1024, 2);
#endif
utils::ThreadPool tp(0);
Network::IOCP iocp;
iocp.init(&tp, SessionProtocol::TLS);
Network::Address addr;
in6_addr in6addr;
Network::Address addr;
in6_addr in6addr;
addr.set(AF_INET6, "::1", 9010);
addr.set(AF_INET, "43.200.173.151", 9010);
Network::TCPSocket sock;
sock.init(AF_INET6);
if (sock.connect(addr) == INVALID_SOCKET) {
spdlog::error("connect()");
std::exit(EXIT_FAILURE);
}
Network::Socket sock;
Network::TCPSocket TCPSock;
Network::UDPSocket UDPSock;
TCPSock.init(AF_INET);
UDPSock.init(AF_INET);
sock = TCPSock;
if (sock.connect(addr) == INVALID_SOCKET) {
spdlog::error("connect()");
std::exit(EXIT_FAILURE);
}
Network::IOCPPASSINDATA* data = new Network::IOCPPASSINDATA(16 * 1024);
data->socket = std::make_shared<Network::TCPSocket>(sock);
data->IOCPInstance = &iocp;
iocp.registerSocket(data);
// SSL_CTX* ctx = ::SSL_CTX_new(::OSSL_QUIC_client_method());
SSL_CTX* ctx = SSL_CTX_new(TLS_client_method());
if (ctx == NULL) {
printf("Failed to create the SSL_CTX\n");
std::exit(EXIT_FAILURE);
}
std::vector<Network::IOCPPASSINDATA*> send_data;
data->event = Network::IOCPEVENT::WRITE;
data->wsabuf.buf[0] = 'a';
data->wsabuf.buf[1] = 'b';
data->wsabuf.buf[2] = ' ';
data->wsabuf.len = 3;
send_data.push_back(data);
Network::IOCPPASSINDATA* data2 = new Network::IOCPPASSINDATA(16 * 1024);
data2->wsabuf.buf[0] = 'b';
data2->wsabuf.buf[1] = 'a';
data2->wsabuf.buf[2] = '\0';
data2->wsabuf.len = 3;
send_data.push_back(data2);
iocp.send(sock.sock, &send_data);
// SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL);
/* * 인증서 검증을 비활성화합니다.
* SSL_VERIFY_NONE 플래그를 사용하면 클라이언트는 서버 인증서를 요청하거나
* 확인하지 않습니다. 경고: 보안상 매우 위험합니다. 테스트용으로만 사용하세요.
*/
SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, NULL);
Network::IOCPPASSINDATA* recv_data = new Network::IOCPPASSINDATA(16 * 1024);
recv_data->socket = std::make_shared<Network::TCPSocket>(sock);
recv_data->IOCPInstance = &iocp;
while (!iocp.recv(recv_data)); // 어떤 데이터를 읽는걸 보장받고 싶다면 그냥 스린락 걸어버리기.
/* Use the default trusted certificate store */
if (!SSL_CTX_set_default_verify_paths(ctx)) {
printf("Failed to set the default trusted certificate store\n");
std::exit(EXIT_FAILURE);
}
spdlog::info("recv_data: {}", recv_data->wsabuf.buf);
Network::IOCPPASSINDATA* data = new Network::IOCPPASSINDATA(16 * 1024, ctx);
data->socket = std::make_shared<Network::Socket>(sock);
data->IOCPInstance = &iocp;
std::vector<Network::IOCPPASSINDATA*> send_data2;
data->event = Network::IOCPEVENT::WRITE;
data->wsabuf.buf[0] = 'c';
data->wsabuf.buf[1] = 'd';
data->wsabuf.buf[2] = ' ';
data->wsabuf.len = 3;
send_data2.push_back(data);
data2 = new Network::IOCPPASSINDATA(16 * 1024);
data2->wsabuf.buf[0] = 'd';
data2->wsabuf.buf[1] = 'c';
data2->wsabuf.buf[2] = '\0';
data2->wsabuf.len = 3;
send_data2.push_back(data2);
iocp.send(sock.sock, &send_data2);
char buf[4096];
int ret = 0;
while ((ret = SSL_connect(data->ssl.get())) != 1) {
if (BIO_ctrl_pending(SSL_get_wbio(data->ssl.get())) > 0) {
// wbio에서 암호화된 데이터를 읽어서
int bytes_to_write =
BIO_read(SSL_get_wbio(data->ssl.get()), buf, sizeof(buf));
if (bytes_to_write > 0) {
// 소켓으로 전송
send(sock.sock, buf, bytes_to_write, 0);
}
}
int err = SSL_get_error(data->ssl.get(), ret);
if (err == SSL_ERROR_WANT_READ) {
// OpenSSL이 소켓에서 데이터를 더 읽어오길 원함
// 소켓에서 데이터를 읽어서
int bytes_read = recv(sock.sock, buf, sizeof(buf), 0);
if (bytes_read > 0) {
// rbio에 써준다
BIO_write(SSL_get_rbio(data->ssl.get()), buf, bytes_read);
} else if (bytes_read == 0) {
// 소켓 연결이 끊김
fprintf(stderr, "Socket closed during handshake.\n");
return 0;
} else {
// 소켓 에러 (EAGAIN/EWOULDBLOCK은 논블록킹 소켓에서 정상)
// 실제 프로덕션 코드에서는 이 부분을 정교하게 처리해야 합니다.
}
} else {
printf("Failed to connect to server\n");
std::exit(EXIT_FAILURE);
}
continue;
}
recv_data = new Network::IOCPPASSINDATA(16 * 1024);
recv_data->socket = std::make_shared<Network::TCPSocket>(sock);
recv_data->IOCPInstance = &iocp;
while (!iocp.recv(recv_data)); // 어떤 데이터를 읽는걸 보장받고 싶다면 그냥
// 스린락 걸어버리기.
iocp.registerTCPSocket(data);
spdlog::info("recv_data: {}", recv_data->wsabuf.buf);
std::vector<Network::IOCPPASSINDATA*> send_data;
data->event = Network::IOCPEVENT::WRITE;
auto snowflake = utils::GenerateID();
auto timestamp = std::to_string(snowflake.timestamp);
::memcpy(
data->wsabuf.buf, timestamp.c_str(), 128
/*(data->bufsize < timestamp.size()) ? data->bufsize : timestamp.size()*/);
data->wsabuf.len = timestamp.size();
send_data.push_back(data);
iocp.send(sock.sock, &send_data);
const veng::GlfwInitialization _glfw;
Network::IOCPPASSINDATA* recv_data =
new Network::IOCPPASSINDATA(16 * 1024, ctx);
recv_data->socket = std::make_shared<Network::Socket>(sock);
recv_data->IOCPInstance = &iocp;
while (!iocp.recv(recv_data)); // 어떤 데이터를 읽는걸 보장받고 싶다면 그냥
// 스핀락 걸어버리기.
veng::Window window("Vulkan Engine", {800, 600});
window.TryMoveToMonitor(0);
auto snowflake2 = utils::GenerateID();
auto timestamp2 = std::to_string(snowflake2.timestamp);
veng::Graphics graphics(&window);
veng::Engine engine(&graphics, &tp);
spdlog::info("recv_data: {}", recv_data->wsabuf.buf);
spdlog::info("current stamp: {}", timestamp2);
engine.LoadModelAsset("assets/player.fbx", "player");
engine.LoadModelAsset("assets/player_flame.fbx", "player_flame");
engine.LoadModelAsset("assets/bullet.fbx", "bullet");
engine.LoadModelAsset("assets/background.fbx", "background");
const veng::GlfwInitialization _glfw;
engine.BeginPlay = BeginPlay;
engine.Tick = Tick;
veng::Window window("Vulkan Engine", {800, 600});
window.TryMoveToMonitor(0);
engine.init();
veng::Graphics graphics(&window);
veng::Engine engine(&graphics, &tp);
while (!window.ShouldClose()) {
glfwPollEvents();
engine.LoadModelAsset("assets/player.fbx", "player");
engine.LoadModelAsset("assets/player_flame.fbx", "player_flame");
engine.LoadModelAsset("assets/bullet.fbx", "bullet");
engine.LoadModelAsset("assets/background.fbx", "background");
engine.Update();
}
engine.BeginPlay = BeginPlay;
engine.Tick = Tick;
return EXIT_SUCCESS;
}
engine.init();
while (!window.ShouldClose()) {
glfwPollEvents();
engine.Update();
}
return EXIT_SUCCESS;
}