직렬화 함수 작성 끝
This commit is contained in:
@@ -18,83 +18,27 @@ std::int32_t main(std::int32_t argc, gsl::zstring* argv) {
|
|||||||
#endif
|
#endif
|
||||||
utils::ThreadPool tp(0);
|
utils::ThreadPool tp(0);
|
||||||
Network::IOCP iocp;
|
Network::IOCP iocp;
|
||||||
iocp.init(&tp, SessionProtocol::TLS);
|
iocp.init(&tp, SessionProtocol::TCP);
|
||||||
|
|
||||||
Network::Address addr;
|
Network::Address addr;
|
||||||
in6_addr in6addr;
|
in6_addr in6addr;
|
||||||
|
|
||||||
addr.set(AF_INET, "43.200.173.151", 9010);
|
addr.set(AF_INET6, "::1", 9010);
|
||||||
|
|
||||||
Network::Socket sock;
|
Network::Socket sock;
|
||||||
Network::TCPSocket TCPSock;
|
Network::TCPSocket TCPSock;
|
||||||
Network::UDPSocket UDPSock;
|
Network::UDPSocket UDPSock;
|
||||||
TCPSock.init(AF_INET);
|
TCPSock.init(AF_INET6);
|
||||||
UDPSock.init(AF_INET);
|
UDPSock.init(AF_INET6);
|
||||||
sock = TCPSock;
|
sock = TCPSock;
|
||||||
if (sock.connect(addr) == INVALID_SOCKET) {
|
if (sock.connect(addr) == INVALID_SOCKET) {
|
||||||
spdlog::error("connect()");
|
spdlog::error("connect()");
|
||||||
std::exit(EXIT_FAILURE);
|
std::exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
// SSL_CTX* ctx = ::SSL_CTX_new(::OSSL_QUIC_client_method());
|
Network::IOCPPASSINDATA* data = new Network::IOCPPASSINDATA(16 * 1024);
|
||||||
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);
|
|
||||||
data->socket = std::make_shared<Network::Socket>(sock);
|
data->socket = std::make_shared<Network::Socket>(sock);
|
||||||
data->IOCPInstance = &iocp;
|
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);
|
iocp.registerTCPSocket(data);
|
||||||
|
|
||||||
std::vector<Network::IOCPPASSINDATA*> send_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 snowflake = utils::GenerateID();
|
||||||
auto timestamp = std::to_string(snowflake.timestamp);
|
auto timestamp = std::to_string(snowflake.timestamp);
|
||||||
::memcpy(
|
::memcpy(
|
||||||
data->wsabuf.buf, timestamp.c_str(), 128
|
data->wsabuf.buf, timestamp.c_str(),
|
||||||
/*(data->bufsize < timestamp.size()) ? data->bufsize : timestamp.size()*/);
|
(data->bufsize < timestamp.size()) ? data->bufsize : timestamp.size());
|
||||||
data->wsabuf.len = timestamp.size();
|
data->wsabuf.len = 16 * 1024;
|
||||||
send_data.push_back(data);
|
send_data.push_back(data);
|
||||||
iocp.send(sock.sock, &send_data);
|
iocp.send(sock.sock, &send_data);
|
||||||
|
|
||||||
Network::IOCPPASSINDATA* recv_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->socket = std::make_shared<Network::Socket>(sock);
|
||||||
recv_data->IOCPInstance = &iocp;
|
recv_data->IOCPInstance = &iocp;
|
||||||
while (!iocp.recv(recv_data)); // 어떤 데이터를 읽는걸 보장받고 싶다면 그냥
|
while (!iocp.recv(recv_data)); // 어떤 데이터를 읽는걸 보장받고 싶다면 그냥
|
||||||
|
|||||||
@@ -1,30 +0,0 @@
|
|||||||
#include "vulkan_engine/asset/object/model.h"
|
|
||||||
|
|
||||||
#include "vulkan_engine/vulkan/graphics.h"
|
|
||||||
|
|
||||||
namespace veng {
|
|
||||||
|
|
||||||
Model::~Model() {
|
|
||||||
if (graphics_ == nullptr) return;
|
|
||||||
|
|
||||||
graphics_->DestroyTexture(material.texture_handle);
|
|
||||||
graphics_->DestroyBuffer(vertex_buffer);
|
|
||||||
graphics_->DestroyBuffer(index_buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
void veng::Model::Update(float dt) {
|
|
||||||
linear_velocity += linear_acceleration * dt;
|
|
||||||
position += linear_velocity * dt;
|
|
||||||
|
|
||||||
angular_velocity += angular_acceleration * dt;
|
|
||||||
if (glm::length(angular_velocity) > 1e-6f) {
|
|
||||||
rotation =
|
|
||||||
glm::normalize(glm::rotate(rotation, glm::length(angular_velocity * dt),
|
|
||||||
glm::normalize(angular_velocity)));
|
|
||||||
}
|
|
||||||
|
|
||||||
transform = glm::translate(glm::mat4(1.0f), position) *
|
|
||||||
glm::mat4_cast(rotation) * glm::scale(glm::mat4(1.0f), scale);
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace veng
|
|
||||||
@@ -4,10 +4,92 @@ set(PROJECT_NAME "Server")
|
|||||||
|
|
||||||
project(${PROJECT_NAME})
|
project(${PROJECT_NAME})
|
||||||
|
|
||||||
add_executable(${PROJECT_NAME}
|
find_package(Vulkan REQUIRED)
|
||||||
"${CMAKE_CURRENT_SOURCE_DIR}/src/echoserver.cpp"
|
find_package(OpenSSL REQUIRED)
|
||||||
|
|
||||||
|
include(FetchContent)
|
||||||
|
|
||||||
|
FetchContent_Declare(
|
||||||
|
glm
|
||||||
|
GIT_REPOSITORY "https://github.com/g-truc/glm.git"
|
||||||
|
GIT_TAG "1.0.1"
|
||||||
|
GIT_SHALLOW ON
|
||||||
)
|
)
|
||||||
|
FetchContent_MakeAvailable(glm)
|
||||||
|
|
||||||
|
FetchContent_Declare(
|
||||||
|
spdlog
|
||||||
|
GIT_REPOSITORY "https://github.com/gabime/spdlog.git"
|
||||||
|
GIT_TAG "v1.15.2"
|
||||||
|
GIT_SHALLOW ON
|
||||||
|
)
|
||||||
|
FetchContent_MakeAvailable(spdlog)
|
||||||
|
|
||||||
|
FetchContent_Declare(
|
||||||
|
glfw
|
||||||
|
GIT_REPOSITORY "https://github.com/glfw/glfw.git"
|
||||||
|
GIT_TAG "3.4"
|
||||||
|
GIT_SHALLOW ON
|
||||||
|
)
|
||||||
|
FetchContent_MakeAvailable(glfw)
|
||||||
|
|
||||||
|
FetchContent_Declare(
|
||||||
|
GSL
|
||||||
|
GIT_REPOSITORY "https://github.com/microsoft/GSL.git"
|
||||||
|
GIT_TAG "v4.2.0"
|
||||||
|
GIT_SHALLOW ON
|
||||||
|
)
|
||||||
|
FetchContent_MakeAvailable(GSL)
|
||||||
|
|
||||||
|
FetchContent_Declare(
|
||||||
|
ASSIMP
|
||||||
|
GIT_REPOSITORY "https://github.com/assimp/assimp.git"
|
||||||
|
GIT_TAG "v5.4.3"
|
||||||
|
GIT_SHALLOW ON
|
||||||
|
)
|
||||||
|
FetchContent_MakeAvailable(ASSIMP)
|
||||||
|
|
||||||
|
file(GLOB_RECURSE Sources CONFIGURE_DEPENDS
|
||||||
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp"
|
||||||
|
)
|
||||||
|
|
||||||
|
add_executable(${PROJECT_NAME} ${RootProjectSources} ${Sources})
|
||||||
|
target_link_libraries(${PROJECT_NAME} PRIVATE Vulkan::Vulkan)
|
||||||
|
target_link_libraries(${PROJECT_NAME} PRIVATE glm)
|
||||||
|
target_link_libraries(${PROJECT_NAME} PRIVATE glfw)
|
||||||
|
target_link_libraries(${PROJECT_NAME} PRIVATE Microsoft.GSL::GSL)
|
||||||
|
target_link_libraries(${PROJECT_NAME} PRIVATE spdlog)
|
||||||
|
target_link_libraries(${PROJECT_NAME} PRIVATE assimp::assimp)
|
||||||
|
target_link_libraries(${PROJECT_NAME} PRIVATE OpenSSL::Crypto)
|
||||||
|
target_link_libraries(${PROJECT_NAME} PRIVATE OpenSSL::SSL)
|
||||||
|
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
target_link_libraries(${PROJECT_NAME} PRIVATE ws2_32)
|
target_link_libraries(${PROJECT_NAME} PRIVATE ws2_32)
|
||||||
endif()
|
endif()
|
||||||
|
if(UNIX AND NOT APPLE AND CMAKE_BUILD_TYPE STREQUAL "Release")
|
||||||
|
set_target_properties(${PROJECT_NAME} PROPERTIES
|
||||||
|
BUILD_WITH_INSTALL_RPATH TRUE
|
||||||
|
INSTALL_RPATH "$ORIGIN"
|
||||||
|
SKIP_BUILD_RPATH FALSE
|
||||||
|
BUILD_RPATH "$ORIGIN"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
target_include_directories(${PROJECT_NAME} PRIVATE "${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.h")
|
||||||
|
|
||||||
|
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
||||||
|
"$<TARGET_FILE:spdlog>"
|
||||||
|
"$<TARGET_FILE_DIR:${PROJECT_NAME}>"
|
||||||
|
COMMENT "Copying spdlog DLL/so to output directory"
|
||||||
|
)
|
||||||
|
|
||||||
|
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E copy_directory
|
||||||
|
"$<TARGET_FILE_DIR:spdlog>"
|
||||||
|
"$<TARGET_FILE_DIR:${PROJECT_NAME}>"
|
||||||
|
COMMENT "Copying spdlog library files and symlinks to output directory"
|
||||||
|
)
|
||||||
@@ -1,93 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
#include <winsock2.h>
|
|
||||||
#include <ws2tcpip.h>
|
|
||||||
#include <ws2bth.h>
|
|
||||||
#include <ws2def.h>
|
|
||||||
#include <windows.h>
|
|
||||||
#define in_addr_t ULONG
|
|
||||||
#elif __linux__
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#include <sys/epoll.h>
|
|
||||||
#include <arpa/inet.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <netinet/in.h>
|
|
||||||
#include <sys/eventfd.h>
|
|
||||||
#define SOCKET int
|
|
||||||
#define INVALID_SOCKET -1
|
|
||||||
#define SOCKET_ERROR -1
|
|
||||||
#else
|
|
||||||
#error "이 플랫폼은 지원되지 않습니다."
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <chrono>
|
|
||||||
|
|
||||||
void err_quit(const char *msg) {
|
|
||||||
char *msgbuf = strerror(errno);
|
|
||||||
fprintf(stderr, "[%s] %s\n", msg, msgbuf);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
void err_display(const char *msg) {
|
|
||||||
char *msgbuf = strerror(errno);
|
|
||||||
fprintf(stderr, "[%s] %s\n", msg, msgbuf);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define LISTENIP "::"
|
|
||||||
#define LISTENPORT 9010
|
|
||||||
#define BUFSIZE 100
|
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
|
||||||
WSADATA wsa;
|
|
||||||
if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) {
|
|
||||||
err_quit("WSAStartup()");
|
|
||||||
return EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
SOCKET listenSocket = socket(AF_INET6, SOCK_STREAM, 0);
|
|
||||||
if (listenSocket == INVALID_SOCKET) err_quit("socket()");
|
|
||||||
|
|
||||||
struct sockaddr_in6 serverAddr;
|
|
||||||
memset(&serverAddr, 0, sizeof(serverAddr));
|
|
||||||
serverAddr.sin6_family = AF_INET6;
|
|
||||||
inet_pton(AF_INET6, LISTENIP, &serverAddr.sin6_addr);
|
|
||||||
serverAddr.sin6_port = htons(LISTENPORT);
|
|
||||||
|
|
||||||
if (SOCKET_ERROR ==
|
|
||||||
bind(listenSocket, (struct sockaddr *)&serverAddr, sizeof(serverAddr)))
|
|
||||||
err_quit("bind()");
|
|
||||||
if (SOCKET_ERROR == listen(listenSocket, SOMAXCONN)) err_quit("listen()");
|
|
||||||
|
|
||||||
SOCKET client_sock;
|
|
||||||
struct sockaddr_in6 client_addr;
|
|
||||||
socklen_t addr_len;
|
|
||||||
|
|
||||||
addr_len = sizeof(client_addr);
|
|
||||||
printf("Waiting for connection...\n");
|
|
||||||
client_sock =
|
|
||||||
accept(listenSocket, (struct sockaddr *)&client_addr, &addr_len);
|
|
||||||
if (client_sock == INVALID_SOCKET) err_quit("accept()");
|
|
||||||
printf("Connection established!\n");
|
|
||||||
|
|
||||||
char buf[BUFSIZE + 1];
|
|
||||||
|
|
||||||
while (2) {
|
|
||||||
int retVal = recv(client_sock, buf, BUFSIZE, 0);
|
|
||||||
if (retVal == SOCKET_ERROR)
|
|
||||||
err_display("recv()");
|
|
||||||
else if (retVal == 0)
|
|
||||||
break;
|
|
||||||
|
|
||||||
char ipv6str[INET6_ADDRSTRLEN];
|
|
||||||
inet_ntop(AF_INET6, &client_addr, ipv6str, sizeof(ipv6str));
|
|
||||||
buf[retVal] = '\0';
|
|
||||||
printf("[TCP/%s:%d] %s\n", ipv6str, ntohs(client_addr.sin6_port), buf);
|
|
||||||
|
|
||||||
if (SOCKET_ERROR == send(client_sock, buf, BUFSIZE, 0))
|
|
||||||
err_display("send()");
|
|
||||||
}
|
|
||||||
|
|
||||||
WSACleanup();
|
|
||||||
}
|
|
||||||
77
Server/src/server.cpp
Normal file
77
Server/src/server.cpp
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
#include <chrono>
|
||||||
|
|
||||||
|
#include "socket/iocp.h"
|
||||||
|
#include "socket/tcp_socket.h"
|
||||||
|
#include "socket/udp_socket.h"
|
||||||
|
#include "socket/wsa_manager.h"
|
||||||
|
#include "utils/log.h"
|
||||||
|
#include "utils/snowflake.h"
|
||||||
|
#include "socket/packet.h"
|
||||||
|
|
||||||
|
#define LISTENIP "::"
|
||||||
|
#define LISTENPORT 9010
|
||||||
|
|
||||||
|
void EchoClient(utils::ThreadPool* tp, Network::IOCP* iocp,
|
||||||
|
Network::TCPSocket NewSock, Network::Address NewAddr) {
|
||||||
|
Network::IOCPPASSINDATA* recv_data = new Network::IOCPPASSINDATA(16 * 1024);
|
||||||
|
recv_data->socket = std::make_shared<Network::Socket>(NewSock);
|
||||||
|
recv_data->IOCPInstance = iocp;
|
||||||
|
auto timestamp = std::chrono::system_clock::now();
|
||||||
|
while (!iocp->recv(recv_data)) {
|
||||||
|
if (std::chrono::duration_cast<std::chrono::milliseconds>(
|
||||||
|
std::chrono::system_clock::now() - timestamp)
|
||||||
|
.count() == 1000) {
|
||||||
|
tp->enqueueJob(EchoClient, iocp, NewSock, NewAddr);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<Network::IOCPPASSINDATA*> send_data;
|
||||||
|
recv_data->event = Network::IOCPEVENT::WRITE;
|
||||||
|
send_data.push_back(recv_data);
|
||||||
|
iocp->send(NewSock.sock, &send_data);
|
||||||
|
|
||||||
|
tp->enqueueJob(EchoClient, iocp, NewSock, NewAddr);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char* 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);
|
||||||
|
|
||||||
|
Network::Address addr;
|
||||||
|
|
||||||
|
addr.set(AF_INET6, "::", 9010);
|
||||||
|
|
||||||
|
Network::Socket* sock;
|
||||||
|
Network::TCPSocket TCPSock;
|
||||||
|
TCPSock.init(AF_INET6);
|
||||||
|
sock = &TCPSock;
|
||||||
|
if (TCPSock.bind(addr) == INVALID_SOCKET) {
|
||||||
|
spdlog::error("bind()");
|
||||||
|
std::exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
if (TCPSock.listen(SOMAXCONN) == INVALID_SOCKET) {
|
||||||
|
spdlog::error("listen()");
|
||||||
|
std::exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
Network::TCPSocket NewSock;
|
||||||
|
Network::Address NewAddr;
|
||||||
|
NewAddr.length = addr.length;
|
||||||
|
spdlog::info("Waiting for connection");
|
||||||
|
TCPSock.accept(NewSock, NewAddr);
|
||||||
|
|
||||||
|
Network::IOCPPASSINDATA* data = new Network::IOCPPASSINDATA(16 * 1024);
|
||||||
|
data->socket = std::make_shared<Network::Socket>(NewSock);
|
||||||
|
data->IOCPInstance = &iocp;
|
||||||
|
iocp.registerTCPSocket(data);
|
||||||
|
|
||||||
|
tp.enqueueJob(EchoClient, &iocp, NewSock, NewAddr);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -176,9 +176,12 @@ void IOCP::iocpWatcher_(utils::ThreadPool* IOCPThread) {
|
|||||||
std::vector<char> buf(16384); // SSL_read최대 반환 크기
|
std::vector<char> buf(16384); // SSL_read최대 반환 크기
|
||||||
int red_data = 0;
|
int red_data = 0;
|
||||||
std::lock_guard lock(*GetRecvQueueMutex_(sock));
|
std::lock_guard lock(*GetRecvQueueMutex_(sock));
|
||||||
auto queue_list = GetRecvQueue_(data->socket->sock);
|
auto queue_list = GetRecvQueue_(sock);
|
||||||
if (data->event == IOCPEVENT::READ) {
|
if (data->event == IOCPEVENT::READ) {
|
||||||
if (proto_ == SessionProtocol::TLS || proto_ == SessionProtocol::QUIC) {
|
if (proto_ == SessionProtocol::TLS ||
|
||||||
|
proto_ == SessionProtocol::QUIC) { // DEPRECATED. openssl을 사용할 수가
|
||||||
|
// 없기 때문에 추후 완성 뒤에 기능을
|
||||||
|
// 붙이든 해야 할 듯 함.
|
||||||
// DEBUG: BIO_write 전 OpenSSL 에러 스택 확인 (혹시 모를 이전 에러)
|
// DEBUG: BIO_write 전 OpenSSL 에러 스택 확인 (혹시 모를 이전 에러)
|
||||||
ERR_print_errors_fp(stderr); // 이미 오류 스택에 뭔가 있는지 확인용
|
ERR_print_errors_fp(stderr); // 이미 오류 스택에 뭔가 있는지 확인용
|
||||||
fprintf(stderr, "--- Before BIO_write ---\n");
|
fprintf(stderr, "--- Before BIO_write ---\n");
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ Socket::operator SOCKET() {
|
|||||||
|
|
||||||
void Socket::set(const SOCKET __sock, int __domain) {
|
void Socket::set(const SOCKET __sock, int __domain) {
|
||||||
if (__sock == INVALID_SOCKET) {
|
if (__sock == INVALID_SOCKET) {
|
||||||
spdlog::critical("socket()");
|
spdlog::error("set failed errno:{} {}", errno, strerror(errno));
|
||||||
std::exit(EXIT_FAILURE);
|
std::exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -11,9 +11,14 @@ int TCPSocket::listen(int __n) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void TCPSocket::accept(TCPSocket &newSock, Address &__addr) {
|
void TCPSocket::accept(TCPSocket &newSock, Address &__addr) {
|
||||||
newSock.set(::accept(sock, &__addr.addr, &__addr.length), domain);
|
SOCKET newsock = INVALID_SOCKET;
|
||||||
|
newsock = ::accept(sock, &__addr.addr, &__addr.length);
|
||||||
|
if (newsock == INVALID_SOCKET) {
|
||||||
|
spdlog::error("accept() errno:{} {}", errno, strerror(errno));
|
||||||
|
std::exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
newSock.set(newsock, domain);
|
||||||
memcpy(&newSock.remoteAddr, &__addr, sizeof(Address));
|
memcpy(&newSock.remoteAddr, &__addr, sizeof(Address));
|
||||||
if (newSock.sock == INVALID_SOCKET) spdlog::error("accept()");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int TCPSocket::connect(Address &serveraddr) {
|
int TCPSocket::connect(Address &serveraddr) {
|
||||||
|
|||||||
91
impl/vulkan_engine/asset/object/model.cpp
Normal file
91
impl/vulkan_engine/asset/object/model.cpp
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
#include "vulkan_engine/asset/object/model.h"
|
||||||
|
|
||||||
|
#include "vulkan_engine/vulkan/graphics.h"
|
||||||
|
|
||||||
|
namespace veng {
|
||||||
|
|
||||||
|
Model::~Model() {
|
||||||
|
if (graphics_ == nullptr) return;
|
||||||
|
|
||||||
|
graphics_->DestroyTexture(material.texture_handle);
|
||||||
|
graphics_->DestroyBuffer(vertex_buffer);
|
||||||
|
graphics_->DestroyBuffer(index_buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
static void Append(std::vector<char>& dst, const T& data) {
|
||||||
|
const char* ptr = reinterpret_cast<const char*>(&data);
|
||||||
|
dst.insert(dst.end(), ptr, ptr + sizeof(T));
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<char> Model::Serialize() {
|
||||||
|
std::vector<char> serialized;
|
||||||
|
|
||||||
|
Append(serialized, ID);
|
||||||
|
|
||||||
|
Append(serialized, transform);
|
||||||
|
Append(serialized, position);
|
||||||
|
Append(serialized, linear_velocity);
|
||||||
|
Append(serialized, linear_acceleration);
|
||||||
|
Append(serialized, rotation);
|
||||||
|
Append(serialized, angular_velocity);
|
||||||
|
Append(serialized, angular_acceleration);
|
||||||
|
Append(serialized, scale);
|
||||||
|
Append(serialized, original_offset);
|
||||||
|
|
||||||
|
Append(serialized, radius);
|
||||||
|
|
||||||
|
uint8_t vis = visible ? 1 : 0;
|
||||||
|
uint8_t col = colision ? 1 : 0;
|
||||||
|
Append(serialized, vis);
|
||||||
|
Append(serialized, col);
|
||||||
|
|
||||||
|
return serialized;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
static void Extract(const std::vector<char>& src, size_t& offset, T& out) {
|
||||||
|
std::memcpy(&out, src.data() + offset, sizeof(T));
|
||||||
|
offset += sizeof(T);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Model::Deserialize(std::vector<char> data) {
|
||||||
|
size_t offset = 0;
|
||||||
|
|
||||||
|
Extract(data, offset, ID);
|
||||||
|
|
||||||
|
Extract(data, offset, transform);
|
||||||
|
Extract(data, offset, position);
|
||||||
|
Extract(data, offset, linear_velocity);
|
||||||
|
Extract(data, offset, linear_acceleration);
|
||||||
|
Extract(data, offset, rotation);
|
||||||
|
Extract(data, offset, angular_velocity);
|
||||||
|
Extract(data, offset, angular_acceleration);
|
||||||
|
Extract(data, offset, scale);
|
||||||
|
Extract(data, offset, original_offset);
|
||||||
|
|
||||||
|
Extract(data, offset, radius);
|
||||||
|
|
||||||
|
uint8_t vis = 0, col = 0;
|
||||||
|
Extract(data, offset, vis);
|
||||||
|
Extract(data, offset, col);
|
||||||
|
visible = vis != 0;
|
||||||
|
colision = col != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void veng::Model::Update(float dt) {
|
||||||
|
linear_velocity += linear_acceleration * dt;
|
||||||
|
position += linear_velocity * dt;
|
||||||
|
|
||||||
|
angular_velocity += angular_acceleration * dt;
|
||||||
|
if (glm::length(angular_velocity) > 1e-6f) {
|
||||||
|
rotation =
|
||||||
|
glm::normalize(glm::rotate(rotation, glm::length(angular_velocity * dt),
|
||||||
|
glm::normalize(angular_velocity)));
|
||||||
|
}
|
||||||
|
|
||||||
|
transform = glm::translate(glm::mat4(1.0f), position) *
|
||||||
|
glm::mat4_cast(rotation) * glm::scale(glm::mat4(1.0f), scale);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace veng
|
||||||
@@ -82,11 +82,12 @@ struct IOCPPASSINDATA {
|
|||||||
wsabuf.len = bufsize;
|
wsabuf.len = bufsize;
|
||||||
}
|
}
|
||||||
|
|
||||||
IOCPPASSINDATA(const IOCPPASSINDATA& other) {
|
/*IOCPPASSINDATA(const IOCPPASSINDATA& other) {
|
||||||
if (this != &other) {
|
if (this != &other) {
|
||||||
std::memset(&overlapped, 0, sizeof(overlapped));
|
std::memset(&overlapped, 0, sizeof(overlapped));
|
||||||
event = other.event;
|
event = other.event;
|
||||||
socket = other.socket;
|
socket = other.socket;
|
||||||
|
ssl = other.ssl;
|
||||||
transferredbytes = other.transferredbytes;
|
transferredbytes = other.transferredbytes;
|
||||||
bufsize = other.bufsize;
|
bufsize = other.bufsize;
|
||||||
IOCPInstance = other.IOCPInstance;
|
IOCPInstance = other.IOCPInstance;
|
||||||
@@ -97,18 +98,19 @@ struct IOCPPASSINDATA {
|
|||||||
wsabuf.len = other.bufsize;
|
wsabuf.len = other.bufsize;
|
||||||
std::memcpy(wsabuf.buf, other.wsabuf.buf, other.wsabuf.len);
|
std::memcpy(wsabuf.buf, other.wsabuf.buf, other.wsabuf.len);
|
||||||
}
|
}
|
||||||
}
|
}*/
|
||||||
|
|
||||||
~IOCPPASSINDATA() {
|
~IOCPPASSINDATA() {
|
||||||
if (wsabuf.buf != nullptr) delete[] wsabuf.buf;
|
if (wsabuf.buf != nullptr) delete[] wsabuf.buf;
|
||||||
wsabuf.buf = nullptr;
|
wsabuf.buf = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
IOCPPASSINDATA& operator=(const IOCPPASSINDATA& other) {
|
/*IOCPPASSINDATA& operator=(const IOCPPASSINDATA& other) {
|
||||||
if (this != &other) {
|
if (this != &other) {
|
||||||
std::memset(&overlapped, 0, sizeof(overlapped));
|
std::memset(&overlapped, 0, sizeof(overlapped));
|
||||||
event = other.event;
|
event = other.event;
|
||||||
socket = other.socket;
|
socket = other.socket;
|
||||||
|
ssl = other.ssl;
|
||||||
transferredbytes = other.transferredbytes;
|
transferredbytes = other.transferredbytes;
|
||||||
bufsize = other.bufsize;
|
bufsize = other.bufsize;
|
||||||
IOCPInstance = other.IOCPInstance;
|
IOCPInstance = other.IOCPInstance;
|
||||||
@@ -121,7 +123,10 @@ struct IOCPPASSINDATA {
|
|||||||
std::memcpy(wsabuf.buf, other.wsabuf.buf, other.wsabuf.len);
|
std::memcpy(wsabuf.buf, other.wsabuf.buf, other.wsabuf.len);
|
||||||
}
|
}
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}*/
|
||||||
|
|
||||||
|
IOCPPASSINDATA(const IOCPPASSINDATA& other) = delete;
|
||||||
|
IOCPPASSINDATA& operator=(const IOCPPASSINDATA&) = delete;
|
||||||
};
|
};
|
||||||
|
|
||||||
class IOCP {
|
class IOCP {
|
||||||
|
|||||||
21
include/socket/packet.h
Normal file
21
include/socket/packet.h
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
namespace Packet {
|
||||||
|
|
||||||
|
enum class Opcode {
|
||||||
|
NOP,
|
||||||
|
SPAWNMODEL,
|
||||||
|
DESPAWNMODEL,
|
||||||
|
UPDATEMODEL,
|
||||||
|
REQUESTMODELIDLIST,
|
||||||
|
COUNT
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Header {
|
||||||
|
Opcode opcode;
|
||||||
|
std::uint32_t body_length;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace Packet
|
||||||
@@ -16,6 +16,13 @@ struct Snowflake {
|
|||||||
bool operator==(const Snowflake& other) const {
|
bool operator==(const Snowflake& other) const {
|
||||||
return snowflake == other.snowflake;
|
return snowflake == other.snowflake;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<char> Serialize() {
|
||||||
|
std::vector<char> serialized;
|
||||||
|
serialized.insert(serialized.end(), &snowflake,
|
||||||
|
&snowflake + sizeof(std::uint64_t));
|
||||||
|
return serialized;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
Snowflake GenerateID();
|
Snowflake GenerateID();
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
#include "material.h"
|
#include "material.h"
|
||||||
#include "vulkan_engine/vulkan/buffer_handle.h"
|
#include "vulkan_engine/vulkan/buffer_handle.h"
|
||||||
#include "vulkan_engine/vulkan/vertex.h"
|
#include "vulkan_engine/vulkan/vertex.h"
|
||||||
|
#include "utils/snowflake.h"
|
||||||
|
|
||||||
namespace veng {
|
namespace veng {
|
||||||
struct Model {
|
struct Model {
|
||||||
@@ -34,6 +35,7 @@ struct Model {
|
|||||||
OnColision(other.OnColision),
|
OnColision(other.OnColision),
|
||||||
visible(other.visible),
|
visible(other.visible),
|
||||||
colision(other.colision) {
|
colision(other.colision) {
|
||||||
|
ID = utils::GenerateID();
|
||||||
graphics_ = nullptr;
|
graphics_ = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -57,12 +59,16 @@ struct Model {
|
|||||||
OnColision(other.OnColision),
|
OnColision(other.OnColision),
|
||||||
visible(other.visible),
|
visible(other.visible),
|
||||||
colision(other.colision) {
|
colision(other.colision) {
|
||||||
|
ID = other.ID;
|
||||||
|
::memset(&other.ID, 0, 64);
|
||||||
|
|
||||||
graphics_ = other.graphics_;
|
graphics_ = other.graphics_;
|
||||||
other.graphics_ = nullptr;
|
other.graphics_ = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
Model& operator=(const Model& other) {
|
Model& operator=(const Model& other) {
|
||||||
if (this != &other) {
|
if (this != &other) {
|
||||||
|
ID = utils::GenerateID();
|
||||||
vertices = other.vertices;
|
vertices = other.vertices;
|
||||||
vertex_buffer = other.vertex_buffer;
|
vertex_buffer = other.vertex_buffer;
|
||||||
indices = other.indices;
|
indices = other.indices;
|
||||||
@@ -90,6 +96,8 @@ struct Model {
|
|||||||
|
|
||||||
Model& operator=(Model&& other) noexcept {
|
Model& operator=(Model&& other) noexcept {
|
||||||
if (this != &other) {
|
if (this != &other) {
|
||||||
|
ID = other.ID;
|
||||||
|
::memset(&other.ID, 0, 64);
|
||||||
vertices = std::move(other.vertices);
|
vertices = std::move(other.vertices);
|
||||||
vertex_buffer = other.vertex_buffer;
|
vertex_buffer = other.vertex_buffer;
|
||||||
indices = std::move(other.indices);
|
indices = std::move(other.indices);
|
||||||
@@ -110,12 +118,15 @@ struct Model {
|
|||||||
visible = other.visible;
|
visible = other.visible;
|
||||||
colision = other.colision;
|
colision = other.colision;
|
||||||
|
|
||||||
// graphics_만 옮기고, 원본은 nullptr
|
|
||||||
graphics_ = other.graphics_;
|
graphics_ = other.graphics_;
|
||||||
other.graphics_ = nullptr;
|
other.graphics_ = nullptr;
|
||||||
}
|
}
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
utils::Snowflake ID;
|
||||||
|
|
||||||
|
std::vector<char> Serialize();
|
||||||
|
void Deserialize(std::vector<char> data);
|
||||||
|
|
||||||
std::vector<veng::Vertex> vertices;
|
std::vector<veng::Vertex> vertices;
|
||||||
veng::BufferHandle vertex_buffer;
|
veng::BufferHandle vertex_buffer;
|
||||||
Reference in New Issue
Block a user