IOCPPASSINDATA 복사 생성자,대입 연산자 추가

This commit is contained in:
2025-05-10 11:32:15 +09:00
parent d5342b5f61
commit 89306442ae
2 changed files with 58 additions and 31 deletions

View File

@@ -255,11 +255,7 @@ void ServerManager::processRoomListRequest(RoomListRequestPacket roomListRequest
int packetLength = roomListResponsePacket.__data.packetLength;
Chattr::IOCPPASSINDATA* ptr = new Chattr::IOCPPASSINDATA;
::memcpy(ptr, data, sizeof(IOCPPASSINDATA));
::memset(&ptr->overlapped, 0, sizeof(OVERLAPPED));
ptr->recvbytes = ptr->sendbytes = 0;
ptr->wsabuf.buf = ptr->buf;
Chattr::IOCPPASSINDATA* ptr = new Chattr::IOCPPASSINDATA(*data);
ptr->wsabuf.len = packetLength + 8;
roomListResponsePacket.convToN();
@@ -334,11 +330,7 @@ void ServerManager::processUsersListRequestPacket(UsersListRequestPacket usersLi
int packetLength = usersListResponsePacket.__data.packetLength;
Chattr::IOCPPASSINDATA* ptr = new Chattr::IOCPPASSINDATA;
::memcpy(ptr, data, sizeof(IOCPPASSINDATA));
::memset(&ptr->overlapped, 0, sizeof(OVERLAPPED));
ptr->recvbytes = ptr->sendbytes = 0;
ptr->wsabuf.buf = ptr->buf;
Chattr::IOCPPASSINDATA* ptr = new Chattr::IOCPPASSINDATA(*data);
ptr->wsabuf.len = packetLength + 8;
usersListResponsePacket.convToN();
@@ -382,12 +374,8 @@ void ServerManager::processDataPostPacket(DataPostPacket dataPostPacket, IOCPPAS
int packetLength = dataPostPacket.__data.packetLength;
for (auto dest : destinationSockets) {
Chattr::IOCPPASSINDATA* ptr = new Chattr::IOCPPASSINDATA;
::memcpy(ptr, data, sizeof(IOCPPASSINDATA));
::memset(&ptr->overlapped, 0, sizeof(OVERLAPPED));
Chattr::IOCPPASSINDATA* ptr = new Chattr::IOCPPASSINDATA(*data);
ptr->socket = dest;
ptr->recvbytes = ptr->sendbytes = 0;
ptr->wsabuf.buf = ptr->buf;
ptr->wsabuf.len = packetLength + 8;
dataPostPacket.convToN();
@@ -431,17 +419,13 @@ void ServerManager::processContinuePacket(ContinuePacket continuePacket, IOCPPAS
int packetLength = continuePacket.__data.packetLength;
for (auto dest : destinationSockets) {
Chattr::IOCPPASSINDATA* ptr = new Chattr::IOCPPASSINDATA;
::memcpy(ptr, data, sizeof(IOCPPASSINDATA));
::memset(&ptr->overlapped, 0, sizeof(OVERLAPPED));
Chattr::IOCPPASSINDATA* ptr = new Chattr::IOCPPASSINDATA(*data);
ptr->socket = dest;
ptr->recvbytes = ptr->sendbytes = 0;
ptr->wsabuf.buf = ptr->buf;
ptr->wsabuf.len = packetLength + 6;
ptr->wsabuf.len = packetLength + 8;
continuePacket.convToN();
memcpy(ptr->wsabuf.buf, continuePacket.serialized, packetLength + 6);
data->sendbytes = packetLength + 6;
memcpy(ptr->wsabuf.buf, continuePacket.serialized, packetLength + 8);
data->sendbytes = packetLength + 8;
data->IOCPInstance->send(ptr, 1, 0);
}
}
@@ -511,10 +495,7 @@ void ServerManager::run() {
spdlog::info("Waiting for connection...");
listenSock_.accept(clientSock_, clientAddr_);
Chattr::IOCPPASSINDATA* ptr = new Chattr::IOCPPASSINDATA;
::memset(&ptr->overlapped, 0, sizeof(OVERLAPPED));
ptr->socket = std::make_shared<TCPSocket>(std::move(clientSock_));
ptr->recvbytes = ptr->sendbytes = 0;
ptr->wsabuf.buf = ptr->buf;
ptr->wsabuf.len = 1500;
ptr->IOCPInstance = &iocp_;

View File

@@ -46,6 +46,56 @@ struct IOCPPASSINDATA {
#ifdef __linux__
std::shared_ptr<std::queue<IOCPPASSINDATA*>> sendQueue;
#endif
IOCPPASSINDATA() {
event = IOCPEVENT::QUIT;
socket = nullptr;
recvbytes = 0;
sendbytes = 0;
transferredbytes = 0;
wsabuf.len = 1500;
wsabuf.buf = this->buf;
IOCPInstance = nullptr;
}
IOCPPASSINDATA(const IOCPPASSINDATA& other)
: event(other.event),
socket(other.socket),
transferredbytes(other.transferredbytes),
wsabuf(other.wsabuf),
IOCPInstance(other.IOCPInstance)
#ifdef __linux__
, sendQueue(other.sendQueue)
#endif
{
recvbytes = 0;
sendbytes = 0;
wsabuf.buf = this->buf;
// buf는 memcpy로 복사
std::memcpy(buf, other.buf, sizeof(buf));
// overlapped는 0으로 초기화 (복사하면 안 됨)
std::memset(&overlapped, 0, sizeof(overlapped));
}
~IOCPPASSINDATA() = default;
// 복사 대입 연산자
IOCPPASSINDATA& operator=(const IOCPPASSINDATA& other) {
if (this != &other) {
event = other.event;
socket = other.socket;
recvbytes = 0;
sendbytes = 0;
transferredbytes = other.transferredbytes;
wsabuf.buf = this->buf;
IOCPInstance = other.IOCPInstance;
#ifdef __linux__
sendQueue = other.sendQueue;
#endif
std::memcpy(buf, other.buf, sizeof(buf));
std::memset(&overlapped, 0, sizeof(overlapped));
}
return *this;
}
};
class IOCP {
@@ -106,11 +156,7 @@ public:
return;
}
}
Chattr::IOCPPASSINDATA* ptr = new Chattr::IOCPPASSINDATA;
::memcpy(ptr, rootIocpData, sizeof(IOCPPASSINDATA));
::memset(&ptr->overlapped, 0, sizeof(OVERLAPPED));
ptr->recvbytes = ptr->sendbytes = 0;
ptr->wsabuf.buf = ptr->buf;
Chattr::IOCPPASSINDATA* ptr = new Chattr::IOCPPASSINDATA(*rootIocpData);
ptr->wsabuf.len = 1500;
int redSize = 0;