diff --git a/Client/src/ClientManager/ClientManager.cpp b/Client/src/ClientManager/ClientManager.cpp index faa9c67..9e5e119 100644 --- a/Client/src/ClientManager/ClientManager.cpp +++ b/Client/src/ClientManager/ClientManager.cpp @@ -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(); + auto promise = std::promise(); + 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") diff --git a/Client/src/client.cpp b/Client/src/client.cpp index 3ef2554..822d32f 100644 --- a/Client/src/client.cpp +++ b/Client/src/client.cpp @@ -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> 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(); } \ No newline at end of file diff --git a/Server/src/ServerManager/ServerManager.cpp b/Server/src/ServerManager/ServerManager.cpp index f9e5fc4..83a24e3 100644 --- a/Server/src/ServerManager/ServerManager.cpp +++ b/Server/src/ServerManager/ServerManager.cpp @@ -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); } } diff --git a/impl/Socket/IOCP.cpp b/impl/Socket/IOCP.cpp index 69560c2..5963d34 100644 --- a/impl/Socket/IOCP.cpp +++ b/impl/Socket/IOCP.cpp @@ -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); diff --git a/include/Socket/IOCP.hpp b/include/Socket/IOCP.hpp index 7d169ed..a696122 100644 --- a/include/Socket/IOCP.hpp +++ b/include/Socket/IOCP.hpp @@ -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;