진짜 그놈의 바이트수 병신같이 못맞추는건 왜 그러는거임?
This commit is contained in:
@@ -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;
|
||||
}
|
||||
@@ -341,7 +359,7 @@ void ClientManager::exitRoom(Snowflake UID, Snowflake RID) {
|
||||
|
||||
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")
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user