진짜 그놈의 바이트수 병신같이 못맞추는건 왜 그러는거임?

This commit is contained in:
2025-05-10 00:47:56 +09:00
parent 7157e67040
commit 6c1b0c6852
5 changed files with 34 additions and 100 deletions

View File

@@ -50,7 +50,18 @@ void ClientManager::_IOCPClient(Chattr::ThreadPool* thread, Chattr::IOCPPASSINDA
}
break;
case PacketSet::ROOMCREATERESPONSE:
case PacketSet::ROOMLISTRESPONSE:
case PacketSet::ROOMLISTRESPONSE: {
RoomListResponsePacket roomListResponsePacket;
std::memcpy(&roomListResponsePacket.serialized, &pack.serialized, 8 + packetLength);
roomListResponsePacket.convToH();
lastResponsePacket_ = std::future<ResponsePacket>();
auto promise = std::promise<ResponsePacket>();
lastResponsePacket_ = promise.get_future();
promise.set_value(roomListResponsePacket);
processRoomListResponse(roomListResponsePacket, data);
}
break;
case PacketSet::ROOMJOINRESPONSE:
case PacketSet::ROOMEXITRESPONSE:
case PacketSet::USERSLISTRESPONSE: {
@@ -177,6 +188,13 @@ void ClientManager::processRoomCreateResponsePacket(RoomCreateResponsePacket roo
}
void ClientManager::processRoomListResponse(RoomListResponsePacket roomListResponsePacket, Chattr::IOCPPASSINDATA* data) {
Snowflake roomId;
::memcpy(&roomId.snowflake, roomListResponsePacket.__data.roomId, sizeof(Snowflake));
std::string roomName((char*)roomListResponsePacket.__data.name, roomListResponsePacket.__data.packetLength - (sizeof(std::uint16_t) * 7));
roomNames_[roomId] = roomName;
findRoomId_[roomName] = roomId;
spdlog::info("{}", roomName);
}
void ClientManager::processRoomJoinResponsePacket(RoomJoinResponsePacket roomJoinResponsePacket, Chattr::IOCPPASSINDATA* data) {
@@ -225,7 +243,7 @@ void ClientManager::sendMessage(Snowflake ID, std::string message) {
dataPostPacket.convToN();
memcpy(data_->wsabuf.buf, dataPostPacket.serialized, packetLength + 8);
iocp_.send(data_, 1, 0, true);
iocp_.send(data_, 1, 0);
}
void ClientManager::registerUser(std::string userName) {
@@ -245,7 +263,7 @@ void ClientManager::registerUser(std::string userName) {
loginRequestPacket.convToN();
memcpy(data_->wsabuf.buf, loginRequestPacket.serialized, packetLength + 8);
data_->sendbytes = packetLength + 8;
iocp_.send(data_, 1, 0, true);
iocp_.send(data_, 1, 0);
}
void ClientManager::getUserList() {
@@ -263,7 +281,7 @@ void ClientManager::getUserList() {
usersListRequestPacket.convToN();
memcpy(data_->wsabuf.buf, usersListRequestPacket.serialized, packetLength + 8);
iocp_.send(data_, 1, 0, true);
iocp_.send(data_, 1, 0);
}
void ClientManager::createRoom(std::string roomName) {
@@ -282,7 +300,7 @@ void ClientManager::createRoom(std::string roomName) {
roomCreateRequestPacket.convToN();
memcpy(data_->wsabuf.buf, roomCreateRequestPacket.serialized, packetLength + 8);
iocp_.send(data_, 1, 0, true);
iocp_.send(data_, 1, 0);
}
void ClientManager::getRoomList() {
@@ -300,7 +318,7 @@ void ClientManager::getRoomList() {
roomListRequestPacket.convToN();
memcpy(data_->wsabuf.buf, roomListRequestPacket.serialized, packetLength + 8);
iocp_.send(data_, 1, 0, true);
iocp_.send(data_, 1, 0);
}
void ClientManager::joinRoom(Snowflake UID, Snowflake RID) {
@@ -319,7 +337,7 @@ void ClientManager::joinRoom(Snowflake UID, Snowflake RID) {
data_->wsabuf.len = packetLength + 8;
roomJoinRequestPacket.convToN();
memcpy(data_->wsabuf.buf, roomJoinRequestPacket.serialized, packetLength + 8);
iocp_.send(data_, 1, 0, true);
iocp_.send(data_, 1, 0);
inRoom_ = true;
myRoomID_ = RID;
}
@@ -338,10 +356,10 @@ void ClientManager::exitRoom(Snowflake UID, Snowflake RID) {
data_->recvbytes = data_->sendbytes = 0;
data_->transferredbytes = 0;
data_->wsabuf.len = packetLength + 8;
roomExitRequestPacket.convToN();
memcpy(data_->wsabuf.buf, roomExitRequestPacket.serialized, packetLength + 8);
iocp_.send(data_, 1, 0, true);
iocp_.send(data_, 1, 0);
inRoom_ = false;
}
@@ -421,7 +439,7 @@ void ClientManager::run() {
exitRoom(myID_, myRoomID_);
}
else if (tokens[0] == "/create") {
std::string roomName = tokenizer.get()[1];
std::string roomName = tokens[1];
createRoom(roomName);
}
else if (tokens[0] == "/userlist")

View File

@@ -11,88 +11,4 @@ int main() {
Chattr::ClientManager client;
client.init();
client.run();
return 0;
Chattr::TCPSocket sock;
sock.init(AF_INET6);
Chattr::Address serveraddr(AF_INET6, "fd8a:5f:3adb:774d:dfae:983f:2e7a:ffba", 9010);
if (sock.connect(serveraddr) == INVALID_SOCKET) {
spdlog::error("{}", strerror(errno));
return 0;
}
spdlog::info("Connection established from {}", (std::string)serveraddr);
Chattr::Snowflake myId;
Chattr::LoginRequestPacket loginRequestPacket;
loginRequestPacket.__data.packetType = Chattr::PacketCategory::PACKET_REQUEST;
loginRequestPacket.__data.requestType = Chattr::RequestType::LOGIN;
loginRequestPacket.__data.dataType = Chattr::DataType::BINARY;
loginRequestPacket.__data.packetLength = 14;
memcpy(loginRequestPacket.__data.data, "Hello, World!", 14);
loginRequestPacket.convToN();
sock.send(loginRequestPacket.serialized, 8 + 14, 0);
Chattr::LoginResponsePacket loginResponsePacket;
sock.recv(loginResponsePacket.serialized, 18, 0);
loginResponsePacket.convToH();
::memcpy(&myId, loginResponsePacket.__data.yourId, sizeof(Chattr::Snowflake));
Chattr::UsersListRequestPacket usersListRequestPacket;
usersListRequestPacket.__data.packetType = Chattr::PacketCategory::PACKET_REQUEST;
usersListRequestPacket.__data.requestType = Chattr::RequestType::USERS_LIST;
usersListRequestPacket.__data.dataType = Chattr::DataType::TEXT;
usersListRequestPacket.__data.packetLength = 0;
usersListRequestPacket.convToN();
sock.send(usersListRequestPacket.serialized, 8, 0);
std::vector<std::pair<Chattr::Snowflake, std::string>> users;
Chattr::UsersListResponsePacket usersListResponsePacket;
sock.recv(usersListResponsePacket.serialized, 8, 0);
std::uint16_t dataLength = ::ntohs(usersListResponsePacket.__data.packetLength);
sock.recv(usersListResponsePacket.serialized + 8, dataLength, 0);
usersListResponsePacket.convToH();
int usersCount = usersListResponsePacket.__data.usersCount;
users.reserve(usersCount);
Chattr::Snowflake userId;
::memcpy(&userId.snowflake, usersListResponsePacket.__data.userId, sizeof(Chattr::Snowflake));
users.emplace_back(
userId,
std::string((char*)usersListResponsePacket.__data.name, usersListResponsePacket.__data.packetLength - 14)
);
for (int i = 0; i < usersCount - 1; i++) {
sock.recv(usersListResponsePacket.serialized, 8, 0);
std::uint16_t dataLength = ::ntohs(usersListResponsePacket.__data.packetLength);
sock.recv(usersListResponsePacket.serialized + 8, dataLength, 0);
usersListResponsePacket.convToH();
::memcpy(&userId.snowflake, usersListResponsePacket.__data.userId, sizeof(Chattr::Snowflake));
users.emplace_back(
userId,
std::string((char*)usersListResponsePacket.__data.name, usersListResponsePacket.__data.packetLength - 14)
);
}
Chattr::DataPostPacket dataPostPacket;
dataPostPacket.__data.packetType = Chattr::PacketCategory::PACKET_POST;
dataPostPacket.__data.requestType = Chattr::RequestType::DATA;
dataPostPacket.__data.dataType = Chattr::DataType::TEXT;
dataPostPacket.__data.packetLength = 14 + 8 + 8;
for (auto user : users)
if (user.first != myId) {
::memcpy(dataPostPacket.__data.destId, &user.first.snowflake, sizeof(Chattr::Snowflake));
break;
}
memcpy(dataPostPacket.__data.data, "Hello, World!", 14);
dataPostPacket.convToN();
sock.send(&dataPostPacket.serialized, 8 + 14 + 8 + 8, 0);
Chattr::ResponsePacket packet;
sock.recv(&packet.serialized, 10, 0);
packet.convToH();
}

View File

@@ -375,11 +375,11 @@ void ServerManager::processDataPostPacket(DataPostPacket dataPostPacket, IOCPPAS
ptr->socket = dest;
ptr->recvbytes = ptr->sendbytes = 0;
ptr->wsabuf.buf = ptr->buf;
ptr->wsabuf.len = packetLength + 6;
ptr->wsabuf.len = packetLength + 8;
dataPostPacket.convToN();
memcpy(ptr->wsabuf.buf, dataPostPacket.serialized, packetLength + 6);
data->sendbytes = packetLength + 6;
memcpy(ptr->wsabuf.buf, dataPostPacket.serialized, packetLength + 8);
data->sendbytes = packetLength + 8;
data->IOCPInstance->send(ptr, 1, 0);
}
}

View File

@@ -55,14 +55,14 @@ int IOCP::recv(Chattr::IOCPPASSINDATA* data, int bufferCount) {
#endif
}
int IOCP::send(Chattr::IOCPPASSINDATA* data, int bufferCount, int __flags, bool client) {
int IOCP::send(Chattr::IOCPPASSINDATA* data, int bufferCount, int __flags) {
data->event = IOCPEVENT::WRITE;
#ifdef _WIN32
DWORD sendbytes = 0;
return ::WSASend(data->socket->sock, &data->wsabuf, bufferCount, &sendbytes, __flags, &data->overlapped, NULL);
#elif __linux__
struct epoll_event ev;
ev.events = EPOLLOUT | EPOLLONESHOT;
ev.events = EPOLLIN | EPOLLOUT | EPOLLONESHOT;
ev.data.ptr = data;
data->sendQueue->push(data);
return ::epoll_ctl(epollfd_, EPOLL_CTL_MOD, data->socket->sock, &ev);

View File

@@ -283,7 +283,7 @@ public:
void registerSocket(IOCPPASSINDATA* data);
int recv(IOCPPASSINDATA* data, int bufferCount);
int send(IOCPPASSINDATA* data, int bufferCount, int __flags, bool client = false);
int send(IOCPPASSINDATA* data, int bufferCount, int __flags);
#ifdef __linux__
int epollDetroyerFd = -1;