일단은 멀티로 접속이 됨..

This commit is contained in:
2025-06-19 02:42:49 +09:00
parent 1b79d946c3
commit fc8217a608
25 changed files with 584 additions and 574 deletions

View File

@@ -10,6 +10,9 @@ struct Address {
void set(int type, gsl::czstring presentationAddr, std::uint16_t port);
void setType(int type);
Address(const Address&) = default;
Address& operator=(const Address&) = default;
operator std::string();
std::uint16_t getPort() const;

View File

@@ -24,80 +24,10 @@ typedef struct __WSABUF {
namespace Network {
class IOCP;
struct IOCPPASSINDATA;
enum class IOCPEVENT { QUIT, READ, WRITE };
struct IOCPPASSINDATA {
OVERLAPPED overlapped;
IOCPEVENT event;
std::shared_ptr<Socket> socket;
std::uint32_t transferredbytes;
WSABUF wsabuf;
std::uint32_t bufsize;
IOCP* IOCPInstance;
#ifdef __linux__
std::shared_ptr<std::queue<IOCPPASSINDATA*>> sendQueue;
#endif
IOCPPASSINDATA(std::uint32_t bufsize) {
std::memset(&overlapped, 0, sizeof(overlapped));
event = IOCPEVENT::QUIT;
socket = nullptr;
transferredbytes = 0;
this->bufsize = bufsize;
IOCPInstance = nullptr;
wsabuf.buf = new char[bufsize];
wsabuf.len = bufsize;
}
/*IOCPPASSINDATA(const IOCPPASSINDATA& other) {
if (this != &other) {
std::memset(&overlapped, 0, sizeof(overlapped));
event = other.event;
socket = other.socket;
ssl = other.ssl;
transferredbytes = other.transferredbytes;
bufsize = other.bufsize;
IOCPInstance = other.IOCPInstance;
#ifdef __linux__
sendQueue = other.sendQueue;
#endif
wsabuf.buf = new char[other.bufsize];
wsabuf.len = other.bufsize;
std::memcpy(wsabuf.buf, other.wsabuf.buf, other.wsabuf.len);
}
}*/
~IOCPPASSINDATA() {
if (wsabuf.buf != nullptr) delete[] wsabuf.buf;
wsabuf.buf = nullptr;
}
/*IOCPPASSINDATA& operator=(const IOCPPASSINDATA& other) {
if (this != &other) {
std::memset(&overlapped, 0, sizeof(overlapped));
event = other.event;
socket = other.socket;
ssl = other.ssl;
transferredbytes = other.transferredbytes;
bufsize = other.bufsize;
IOCPInstance = other.IOCPInstance;
#ifdef __linux__
sendQueue = other.sendQueue;
#endif
if (wsabuf.buf != nullptr) delete[] wsabuf.buf;
wsabuf.buf = new char[other.bufsize];
wsabuf.len = other.bufsize;
std::memcpy(wsabuf.buf, other.wsabuf.buf, other.wsabuf.len);
}
return *this;
}*/
IOCPPASSINDATA(const IOCPPASSINDATA& other) = delete;
IOCPPASSINDATA& operator=(const IOCPPASSINDATA&) = delete;
};
std::list<char> DEFAULT_RECVALL_CALLBACK(utils::ThreadPool* th,
IOCPPASSINDATA* data);
class IOCP {
public:
@@ -108,15 +38,26 @@ class IOCP {
void destruct();
void registerTCPSocket(Socket& sock, std::uint32_t bufsize);
void registerUDPSocket(IOCPPASSINDATA* data, Address recv_addr);
void registerSocket(std::shared_ptr<Socket> sock);
int recv(Socket& sock, std::vector<char>& data);
std::future<std::vector<char>> recvFull(
std::shared_ptr<Socket> sock, std::uint32_t bufsize);
std::future<std::list<char>> recv(
std::shared_ptr<Socket> sock, std::uint32_t bufsize,
std::function<std::list<char>(utils::ThreadPool*, IOCPPASSINDATA*)>
callback = DEFAULT_RECVALL_CALLBACK);
// data는 한 가지 소켓에 보내는 패킷만 담아야 합니다
int send(Socket& sock, std::vector<char>& data);
int send(std::shared_ptr<Socket> sock, std::vector<char>& data);
int GetRecvedBytes(SOCKET sock);
std::shared_ptr<std::list<IOCPPASSINDATA*>> GetSendQueue(SOCKET sock);
std::shared_ptr<std::list<std::pair<std::vector<char>, std::uint32_t>>>
GetRecvQueue(SOCKET sock);
std::shared_ptr<std::mutex> GetSendQueueMutex(SOCKET sock);
std::shared_ptr<std::mutex> GetRecvQueueMutex(SOCKET sock);
private:
#ifdef _WIN32
void iocpWatcher_(utils::ThreadPool* IOCPThread);
@@ -124,12 +65,6 @@ class IOCP {
#endif
std::shared_ptr<std::list<IOCPPASSINDATA*>> GetSendQueue_(SOCKET sock);
std::shared_ptr<std::list<std::pair<std::vector<char>, std::uint32_t>>>
GetRecvQueue_(SOCKET sock);
std::shared_ptr<std::mutex> GetSendQueueMutex_(SOCKET sock);
std::shared_ptr<std::mutex> GetRecvQueueMutex_(SOCKET sock);
void packet_sender_(SOCKET sock);
utils::ThreadPool* IOCPThread_;
@@ -182,4 +117,56 @@ class IOCP {
#endif
};
enum class IOCPEVENT { QUIT, READ, WRITE };
struct IOCPPASSINDATA {
OVERLAPPED overlapped;
IOCPEVENT event;
std::shared_ptr<Socket> socket;
std::uint32_t transferredbytes;
WSABUF wsabuf;
IOCP* IOCPInstance;
std::packaged_task<std::list<char>(utils::ThreadPool*, IOCPPASSINDATA*)>
callback;
#ifdef __linux__
std::shared_ptr<std::queue<IOCPPASSINDATA*>> sendQueue;
#endif
IOCPPASSINDATA(std::shared_ptr<Socket> socket, std::uint32_t bufsize,
IOCP* IOCPInstance)
: event(IOCPEVENT::QUIT),
socket(socket),
transferredbytes(0),
IOCPInstance(IOCPInstance) {
std::memset(&overlapped, 0, sizeof(overlapped));
wsabuf.buf = new char[bufsize];
wsabuf.len = bufsize;
}
IOCPPASSINDATA(
std::shared_ptr<Socket> socket, std::uint32_t bufsize, IOCP* IOCPInstance,
std::packaged_task<std::list<char>(utils::ThreadPool*, IOCPPASSINDATA*)>
callback_)
: event(IOCPEVENT::QUIT),
socket(socket),
transferredbytes(0),
IOCPInstance(IOCPInstance),
callback(std::move(callback_)) {
std::memset(&overlapped, 0, sizeof(overlapped));
wsabuf.buf = new char[bufsize];
wsabuf.len = bufsize;
}
~IOCPPASSINDATA() {
if (wsabuf.buf != nullptr) delete[] wsabuf.buf;
wsabuf.buf = nullptr;
}
IOCPPASSINDATA(const IOCPPASSINDATA& other) = delete;
IOCPPASSINDATA& operator=(const IOCPPASSINDATA&) = delete;
IOCPPASSINDATA(IOCPPASSINDATA&&) = default;
IOCPPASSINDATA& operator=(IOCPPASSINDATA&&) = default;
};
} // namespace Network

View File

@@ -16,18 +16,21 @@ enum class Opcode : std::uint16_t {
struct Header {
Opcode opcode;
double timestamp;
std::uint32_t body_length;
std::vector<char> Serialize() {
std::vector<char> serialize(6);
std::vector<char> serialize(14);
::memcpy(serialize.data(), &opcode, 2);
::memcpy(serialize.data() + 2, &body_length, 4);
::memcpy(serialize.data() + 2, &timestamp, 8);
::memcpy(serialize.data() + 10, &body_length, 4);
return serialize;
}
void Deserialize(std::vector<char>& data) {
::memcpy(&opcode, data.data(), 2);
::memcpy(&body_length, data.data() + 2, 4);
::memcpy(&timestamp, data.data() + 2, 8);
::memcpy(&body_length, data.data() + 10, 4);
}
};

View File

@@ -26,8 +26,9 @@ class Socket {
int sendto(const void* __buf, size_t __n, int __flags, struct Address __addr);
Socket(const Socket&);
Socket(Socket&&) noexcept;
Socket& operator=(const Socket&);
Socket(Socket&&) noexcept;
Socket& operator=(Socket&&) noexcept;
struct Address bindAddr = {};

View File

@@ -9,8 +9,7 @@ class TCPSocket : public Socket {
using Socket::Socket;
int init(int domain);
int listen(int __n);
void accept(TCPSocket& newSock, Address& addr);
int connect(Network::Address& serveraddr);
void accept(std::shared_ptr<TCPSocket>& newSock, Address& addr);
int recv(void* __restrict __buf, size_t __n, int __flags);
int send(const void* __buf, size_t __n, int __flags);
};

View File

@@ -18,14 +18,13 @@ struct Snowflake {
}
std::vector<char> Serialize() {
std::vector<char> serialized;
serialized.insert(serialized.end(), &snowflake,
&snowflake + sizeof(snowflake));
std::vector<char> serialized(8);
::memcpy(serialized.data(), &snowflake, 8);
return serialized;
}
};
Snowflake GenerateID(std::uint16_t instance);
Snowflake GenerateID(std::uint8_t instance);
} // namespace Chattr

9
include/utils/utils.h Normal file
View File

@@ -0,0 +1,9 @@
#pragma once
#include <list>
#include <vector>
namespace utils {
std::vector<char> CvtListToVector(std::list<char> data);
} // namespace std

View File

@@ -5,20 +5,25 @@
#include <vector>
#include "material.h"
#include "utils/snowflake.h"
#include "vulkan_engine/vulkan/buffer_handle.h"
#include "vulkan_engine/vulkan/vertex.h"
#include "utils/snowflake.h"
extern std::uint8_t CLIENTID;
namespace veng {
struct Model {
Model() : graphics_(nullptr) {}
Model(class Graphics* graphics) : graphics_(graphics) {}
Model() : ID(utils::GenerateID(CLIENTID)), graphics_(nullptr) {
}
Model(class Graphics* graphics)
: ID(utils::GenerateID(CLIENTID)), graphics_(graphics) {
}
~Model();
Model(const Model& other)
: asset_name(other.asset_name),
: ID(utils::GenerateID(CLIENTID)),
name(/*"_" + */other.name),
asset_name(other.asset_name),
vertices(other.vertices),
vertex_buffer(other.vertex_buffer),
indices(other.indices),
@@ -39,14 +44,14 @@ struct Model {
OnColision(other.OnColision),
visible(other.visible),
colision(other.colision),
networkReplicated(other.networkReplicated) {
name = "_" + other.name;
ID = utils::GenerateID(CLIENTID);
networkReplicated(other.networkReplicated),
lastUpdatedTime(other.lastUpdatedTime) {
graphics_ = nullptr;
}
Model(Model&& other)
: name(other.name),
: ID(other.ID),
name(other.name),
asset_name(other.asset_name),
vertices(std::move(other.vertices)),
vertex_buffer(std::move(other.vertex_buffer)),
@@ -68,9 +73,8 @@ struct Model {
OnColision(other.OnColision),
visible(other.visible),
colision(other.colision),
networkReplicated(other.networkReplicated)
{
ID = other.ID;
networkReplicated(other.networkReplicated),
lastUpdatedTime(other.lastUpdatedTime) {
::memset(&other.ID, 0, 8);
graphics_ = other.graphics_;
@@ -104,6 +108,7 @@ struct Model {
visible = other.visible;
colision = other.colision;
networkReplicated = other.networkReplicated;
lastUpdatedTime = other.lastUpdatedTime;
graphics_ = other.graphics_;
other.graphics_ = nullptr;
@@ -141,13 +146,14 @@ struct Model {
glm::vec3 original_offset = glm::vec3(0.f);
Model* owner = this;
std::weak_ptr<Model> owner;
std::float_t radius = 0.f;
std::float_t lifespan = -1.f;
std::function<void(Model* self, Model* other)> OnColision = nullptr;
std::function<void(std::shared_ptr<Model> self, std::shared_ptr<Model> other)>
OnColision = nullptr;
bool visible = true;
bool colision = false;
@@ -156,6 +162,10 @@ struct Model {
bool needsUpdate = true;
double lastUpdatedTime = 0.f; // 서버 기준 업데이트된 시간임
std::mutex modding;
private:
class Graphics* graphics_;
};

View File

@@ -20,9 +20,9 @@ class Engine {
const Model* GetStaticModel(std::string name);
// 수명을 무제한으로 놓고 싶으면 lifespan을 -1으로 설정하면 됨
Model* SpawnLifedModel(std::string asset_name, std::string name,
std::shared_ptr<Model> SpawnLifedModel(std::string asset_name, std::string name,
std::float_t lifespan);
Model* GetSpawnedObject(std::string name);
std::shared_ptr<Model> GetSpawnedObject(std::string name);
void Update();
void NetUpdate(std::shared_ptr<Network::Socket> sock);
@@ -53,7 +53,7 @@ class Engine {
std::unordered_map<std::string, veng::Model> model_assets_;
std::unordered_map<std::string, veng::Model> models_;
std::unordered_map<std::string, std::shared_ptr<Model>> models_;
};
} // namespace veng

View File

@@ -33,7 +33,7 @@ class Graphics final {
void RenderBuffer(BufferHandle handle, std::uint32_t vertex_count);
void RenderIndexedBuffer(BufferHandle vertex_buffer,
BufferHandle index_buffer, std::uint32_t count);
void RenderModel(struct Model* model);
void RenderModel(std::shared_ptr<struct Model> model);
void EndFrame();
BufferHandle CreateVertexBuffer(gsl::span<Vertex> vertices);

View File

@@ -7,7 +7,8 @@
namespace veng {
class Physics {
public:
void invokeOnColisionEvent(gsl::not_null<utils::ThreadPool *> thread_pool, gsl::span<Model*> models);
void invokeOnColisionEvent(gsl::not_null<utils::ThreadPool*> thread_pool,
std::vector<std::shared_ptr<Model>> models);
bool RayTrace(const glm::vec3& rayOrigin, const glm::vec3& rayDir,
const glm::vec3& v0, const glm::vec3& v1, const glm::vec3& v2,