Network: Propagate Room closing to connected members

This commit is contained in:
B3n30 2017-07-15 11:39:27 +02:00
parent a0626221a5
commit 253d3dd3d8
3 changed files with 28 additions and 3 deletions

View file

@ -84,6 +84,11 @@ public:
*/ */
void SendJoinSuccess(ENetPeer* client, MacAddress mac_address); void SendJoinSuccess(ENetPeer* client, MacAddress mac_address);
/**
* Notifies the members that the room is closed,
*/
void SendCloseMessage();
/** /**
* Sends the information about the room, along with the list of members * Sends the information about the room, along with the list of members
* to every connected client in the room. * to every connected client in the room.
@ -159,6 +164,8 @@ void Room::RoomImpl::ServerLoop() {
} }
} }
} }
// Close the connection to all members:
SendCloseMessage();
} }
void Room::RoomImpl::StartLoop() { void Room::RoomImpl::StartLoop() {
@ -266,6 +273,20 @@ void Room::RoomImpl::SendJoinSuccess(ENetPeer* client, MacAddress mac_address) {
enet_host_flush(server); enet_host_flush(server);
} }
void Room::RoomImpl::SendCloseMessage() {
Packet packet;
packet << static_cast<MessageID>(IdCloseRoom);
ENetPacket* enet_packet =
enet_packet_create(packet.GetData(), packet.GetDataSize(), ENET_PACKET_FLAG_RELIABLE);
for (auto& member : members) {
enet_peer_send(member.peer, 0, enet_packet);
}
enet_host_flush(server);
for (auto& member : members) {
enet_peer_disconnect(member.peer, 0);
}
}
void Room::RoomImpl::BroadcastRoomInformation() { void Room::RoomImpl::BroadcastRoomInformation() {
Packet packet; Packet packet;
packet << static_cast<MessageID>(IdRoomInformation); packet << static_cast<MessageID>(IdRoomInformation);

View file

@ -127,6 +127,9 @@ void RoomMember::RoomMemberImpl::MemberLoop() {
case IdVersionMismatch: case IdVersionMismatch:
SetState(State::WrongVersion); SetState(State::WrongVersion);
break; break;
case IdCloseRoom:
SetState(State::LostConnection);
break;
default: default:
break; break;
} }
@ -307,7 +310,7 @@ RoomInformation RoomMember::GetRoomInformation() const {
} }
void RoomMember::Join(const std::string& nick, const char* server_addr, u16 server_port, void RoomMember::Join(const std::string& nick, const char* server_addr, u16 server_port,
u16 client_port) { u16 client_port, const MacAddress& preferred_mac) {
// If the member is connected, kill the connection first // If the member is connected, kill the connection first
if (room_member_impl->loop_thread && room_member_impl->loop_thread->joinable()) { if (room_member_impl->loop_thread && room_member_impl->loop_thread->joinable()) {
room_member_impl->SetState(State::Error); room_member_impl->SetState(State::Error);
@ -336,7 +339,7 @@ void RoomMember::Join(const std::string& nick, const char* server_addr, u16 serv
room_member_impl->nickname = nick; room_member_impl->nickname = nick;
room_member_impl->SetState(State::Joining); room_member_impl->SetState(State::Joining);
room_member_impl->StartLoop(); room_member_impl->StartLoop();
room_member_impl->SendJoinRequest(nick); room_member_impl->SendJoinRequest(nick, preferred_mac);
} else { } else {
room_member_impl->SetState(State::CouldNotConnect); room_member_impl->SetState(State::CouldNotConnect);
} }

View file

@ -97,7 +97,8 @@ public:
* This may fail if the username is already taken. * This may fail if the username is already taken.
*/ */
void Join(const std::string& nickname, const char* server_addr = "127.0.0.1", void Join(const std::string& nickname, const char* server_addr = "127.0.0.1",
const u16 serverPort = DefaultRoomPort, const u16 clientPort = 0); const u16 serverPort = DefaultRoomPort, const u16 clientPort = 0,
const MacAddress& preferred_mac = NoPreferredMac);
/** /**
* Sends a WiFi packet to the room. * Sends a WiFi packet to the room.