직렬화 함수 작성 끝

This commit is contained in:
2025-06-09 03:47:48 +09:00
parent 5ba62b5312
commit 50c9bd68fc
47 changed files with 324 additions and 201 deletions

View File

@@ -18,83 +18,27 @@ std::int32_t main(std::int32_t argc, gsl::zstring* argv) {
#endif
utils::ThreadPool tp(0);
Network::IOCP iocp;
iocp.init(&tp, SessionProtocol::TLS);
iocp.init(&tp, SessionProtocol::TCP);
Network::Address addr;
in6_addr in6addr;
addr.set(AF_INET, "43.200.173.151", 9010);
addr.set(AF_INET6, "::1", 9010);
Network::Socket sock;
Network::TCPSocket TCPSock;
Network::UDPSocket UDPSock;
TCPSock.init(AF_INET);
UDPSock.init(AF_INET);
TCPSock.init(AF_INET6);
UDPSock.init(AF_INET6);
sock = TCPSock;
if (sock.connect(addr) == INVALID_SOCKET) {
spdlog::error("connect()");
std::exit(EXIT_FAILURE);
}
// 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);
}
// SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL);
/* * 인증서 검증을 비활성화합니다.
* SSL_VERIFY_NONE 플래그를 사용하면 클라이언트는 서버 인증서를 요청하거나
* 확인하지 않습니다. 경고: 보안상 매우 위험합니다. 테스트용으로만 사용하세요.
*/
SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, NULL);
/* 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);
}
Network::IOCPPASSINDATA* data = new Network::IOCPPASSINDATA(16 * 1024, ctx);
Network::IOCPPASSINDATA* data = new Network::IOCPPASSINDATA(16 * 1024);
data->socket = std::make_shared<Network::Socket>(sock);
data->IOCPInstance = &iocp;
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;
}
iocp.registerTCPSocket(data);
std::vector<Network::IOCPPASSINDATA*> send_data;
@@ -102,14 +46,14 @@ std::int32_t main(std::int32_t argc, gsl::zstring* argv) {
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();
data->wsabuf.buf, timestamp.c_str(),
(data->bufsize < timestamp.size()) ? data->bufsize : timestamp.size());
data->wsabuf.len = 16 * 1024;
send_data.push_back(data);
iocp.send(sock.sock, &send_data);
Network::IOCPPASSINDATA* recv_data =
new Network::IOCPPASSINDATA(16 * 1024, ctx);
new Network::IOCPPASSINDATA(16 * 1024);
recv_data->socket = std::make_shared<Network::Socket>(sock);
recv_data->IOCPInstance = &iocp;
while (!iocp.recv(recv_data)); // 어떤 데이터를 읽는걸 보장받고 싶다면 그냥