직렬화 함수 작성 끝
This commit is contained in:
@@ -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)); // 어떤 데이터를 읽는걸 보장받고 싶다면 그냥
|
||||
|
||||
Reference in New Issue
Block a user