진짜 그놈의 바이트수 병신같이 못맞추는건 왜 그러는거임?
This commit is contained in:
@@ -50,7 +50,18 @@ void ClientManager::_IOCPClient(Chattr::ThreadPool* thread, Chattr::IOCPPASSINDA
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PacketSet::ROOMCREATERESPONSE:
|
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::ROOMJOINRESPONSE:
|
||||||
case PacketSet::ROOMEXITRESPONSE:
|
case PacketSet::ROOMEXITRESPONSE:
|
||||||
case PacketSet::USERSLISTRESPONSE: {
|
case PacketSet::USERSLISTRESPONSE: {
|
||||||
@@ -177,6 +188,13 @@ void ClientManager::processRoomCreateResponsePacket(RoomCreateResponsePacket roo
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ClientManager::processRoomListResponse(RoomListResponsePacket roomListResponsePacket, Chattr::IOCPPASSINDATA* data) {
|
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) {
|
void ClientManager::processRoomJoinResponsePacket(RoomJoinResponsePacket roomJoinResponsePacket, Chattr::IOCPPASSINDATA* data) {
|
||||||
@@ -225,7 +243,7 @@ void ClientManager::sendMessage(Snowflake ID, std::string message) {
|
|||||||
|
|
||||||
dataPostPacket.convToN();
|
dataPostPacket.convToN();
|
||||||
memcpy(data_->wsabuf.buf, dataPostPacket.serialized, packetLength + 8);
|
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) {
|
void ClientManager::registerUser(std::string userName) {
|
||||||
@@ -245,7 +263,7 @@ void ClientManager::registerUser(std::string userName) {
|
|||||||
loginRequestPacket.convToN();
|
loginRequestPacket.convToN();
|
||||||
memcpy(data_->wsabuf.buf, loginRequestPacket.serialized, packetLength + 8);
|
memcpy(data_->wsabuf.buf, loginRequestPacket.serialized, packetLength + 8);
|
||||||
data_->sendbytes = packetLength + 8;
|
data_->sendbytes = packetLength + 8;
|
||||||
iocp_.send(data_, 1, 0, true);
|
iocp_.send(data_, 1, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClientManager::getUserList() {
|
void ClientManager::getUserList() {
|
||||||
@@ -263,7 +281,7 @@ void ClientManager::getUserList() {
|
|||||||
|
|
||||||
usersListRequestPacket.convToN();
|
usersListRequestPacket.convToN();
|
||||||
memcpy(data_->wsabuf.buf, usersListRequestPacket.serialized, packetLength + 8);
|
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) {
|
void ClientManager::createRoom(std::string roomName) {
|
||||||
@@ -282,7 +300,7 @@ void ClientManager::createRoom(std::string roomName) {
|
|||||||
|
|
||||||
roomCreateRequestPacket.convToN();
|
roomCreateRequestPacket.convToN();
|
||||||
memcpy(data_->wsabuf.buf, roomCreateRequestPacket.serialized, packetLength + 8);
|
memcpy(data_->wsabuf.buf, roomCreateRequestPacket.serialized, packetLength + 8);
|
||||||
iocp_.send(data_, 1, 0, true);
|
iocp_.send(data_, 1, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClientManager::getRoomList() {
|
void ClientManager::getRoomList() {
|
||||||
@@ -300,7 +318,7 @@ void ClientManager::getRoomList() {
|
|||||||
|
|
||||||
roomListRequestPacket.convToN();
|
roomListRequestPacket.convToN();
|
||||||
memcpy(data_->wsabuf.buf, roomListRequestPacket.serialized, packetLength + 8);
|
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) {
|
void ClientManager::joinRoom(Snowflake UID, Snowflake RID) {
|
||||||
@@ -319,7 +337,7 @@ void ClientManager::joinRoom(Snowflake UID, Snowflake RID) {
|
|||||||
data_->wsabuf.len = packetLength + 8;
|
data_->wsabuf.len = packetLength + 8;
|
||||||
roomJoinRequestPacket.convToN();
|
roomJoinRequestPacket.convToN();
|
||||||
memcpy(data_->wsabuf.buf, roomJoinRequestPacket.serialized, packetLength + 8);
|
memcpy(data_->wsabuf.buf, roomJoinRequestPacket.serialized, packetLength + 8);
|
||||||
iocp_.send(data_, 1, 0, true);
|
iocp_.send(data_, 1, 0);
|
||||||
inRoom_ = true;
|
inRoom_ = true;
|
||||||
myRoomID_ = RID;
|
myRoomID_ = RID;
|
||||||
}
|
}
|
||||||
@@ -338,10 +356,10 @@ void ClientManager::exitRoom(Snowflake UID, Snowflake RID) {
|
|||||||
data_->recvbytes = data_->sendbytes = 0;
|
data_->recvbytes = data_->sendbytes = 0;
|
||||||
data_->transferredbytes = 0;
|
data_->transferredbytes = 0;
|
||||||
data_->wsabuf.len = packetLength + 8;
|
data_->wsabuf.len = packetLength + 8;
|
||||||
|
|
||||||
roomExitRequestPacket.convToN();
|
roomExitRequestPacket.convToN();
|
||||||
memcpy(data_->wsabuf.buf, roomExitRequestPacket.serialized, packetLength + 8);
|
memcpy(data_->wsabuf.buf, roomExitRequestPacket.serialized, packetLength + 8);
|
||||||
iocp_.send(data_, 1, 0, true);
|
iocp_.send(data_, 1, 0);
|
||||||
inRoom_ = false;
|
inRoom_ = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -421,7 +439,7 @@ void ClientManager::run() {
|
|||||||
exitRoom(myID_, myRoomID_);
|
exitRoom(myID_, myRoomID_);
|
||||||
}
|
}
|
||||||
else if (tokens[0] == "/create") {
|
else if (tokens[0] == "/create") {
|
||||||
std::string roomName = tokenizer.get()[1];
|
std::string roomName = tokens[1];
|
||||||
createRoom(roomName);
|
createRoom(roomName);
|
||||||
}
|
}
|
||||||
else if (tokens[0] == "/userlist")
|
else if (tokens[0] == "/userlist")
|
||||||
|
|||||||
@@ -11,88 +11,4 @@ int main() {
|
|||||||
Chattr::ClientManager client;
|
Chattr::ClientManager client;
|
||||||
client.init();
|
client.init();
|
||||||
client.run();
|
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->socket = dest;
|
||||||
ptr->recvbytes = ptr->sendbytes = 0;
|
ptr->recvbytes = ptr->sendbytes = 0;
|
||||||
ptr->wsabuf.buf = ptr->buf;
|
ptr->wsabuf.buf = ptr->buf;
|
||||||
ptr->wsabuf.len = packetLength + 6;
|
ptr->wsabuf.len = packetLength + 8;
|
||||||
|
|
||||||
dataPostPacket.convToN();
|
dataPostPacket.convToN();
|
||||||
memcpy(ptr->wsabuf.buf, dataPostPacket.serialized, packetLength + 6);
|
memcpy(ptr->wsabuf.buf, dataPostPacket.serialized, packetLength + 8);
|
||||||
data->sendbytes = packetLength + 6;
|
data->sendbytes = packetLength + 8;
|
||||||
data->IOCPInstance->send(ptr, 1, 0);
|
data->IOCPInstance->send(ptr, 1, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -55,14 +55,14 @@ int IOCP::recv(Chattr::IOCPPASSINDATA* data, int bufferCount) {
|
|||||||
#endif
|
#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;
|
data->event = IOCPEVENT::WRITE;
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
DWORD sendbytes = 0;
|
DWORD sendbytes = 0;
|
||||||
return ::WSASend(data->socket->sock, &data->wsabuf, bufferCount, &sendbytes, __flags, &data->overlapped, NULL);
|
return ::WSASend(data->socket->sock, &data->wsabuf, bufferCount, &sendbytes, __flags, &data->overlapped, NULL);
|
||||||
#elif __linux__
|
#elif __linux__
|
||||||
struct epoll_event ev;
|
struct epoll_event ev;
|
||||||
ev.events = EPOLLOUT | EPOLLONESHOT;
|
ev.events = EPOLLIN | EPOLLOUT | EPOLLONESHOT;
|
||||||
ev.data.ptr = data;
|
ev.data.ptr = data;
|
||||||
data->sendQueue->push(data);
|
data->sendQueue->push(data);
|
||||||
return ::epoll_ctl(epollfd_, EPOLL_CTL_MOD, data->socket->sock, &ev);
|
return ::epoll_ctl(epollfd_, EPOLL_CTL_MOD, data->socket->sock, &ev);
|
||||||
|
|||||||
@@ -283,7 +283,7 @@ public:
|
|||||||
void registerSocket(IOCPPASSINDATA* data);
|
void registerSocket(IOCPPASSINDATA* data);
|
||||||
|
|
||||||
int recv(IOCPPASSINDATA* data, int bufferCount);
|
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__
|
#ifdef __linux__
|
||||||
int epollDetroyerFd = -1;
|
int epollDetroyerFd = -1;
|
||||||
|
|||||||
Reference in New Issue
Block a user