udp/tcp 비동기 통신은 현재 가능
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user