public Room(string Id, Peer Creator, int MaxPlayers, int ListenPort) { this.Members = new Dictionary<int, Peer>(); this.Id = Id; this.Creator = Creator; this.MaxPlayers = MaxPlayers; this.ListenPort = ListenPort; this.Members.Add(Creator.Id, Creator); }
public void ReceiveCallback(IAsyncResult target) { try { object[] obj = new object[2]; obj = (object[])target.AsyncState; byte[] data = (byte[])obj[0]; Socket handler = (Socket)obj[1]; IPAddress tempIP = (handler.RemoteEndPoint as IPEndPoint).Address; string content = string.Empty; int bytesRead = handler.EndReceive(target); if (bytesRead > 0) { Message request = new Message(data); Message response; Message.MessageType requestType = request.GetMessageType(); if (requestType == Message.MessageType.HandshakePeer) { #region Handshake Logger.WriteLine("New peer with IP Address " + (handler.RemoteEndPoint as IPEndPoint).Address.ToString() + " request handshake."); if (peers.Count < Configuration.MaxPeer) { int newPeerId = GenerateNewPeerId(); Peer peer = new Peer(newPeerId, (handler.RemoteEndPoint as IPEndPoint).Address); peers.Add(newPeerId, peer); Logger.WriteLine("Peer with IP Address " + (handler.RemoteEndPoint as IPEndPoint).Address.ToString() + " registered with ID " + newPeerId + "."); Logger.WriteLine(peer); Logger.WriteLine(); // send handshake response with ID response = Message.CreateMessageHandshakeTracker(newPeerId); handler.Send(response.data, 0, response.data.Length, SocketFlags.None); } else { // send handshake response with ID response = Message.CreateMessageFailed(); handler.Send(response.data, 0, response.data.Length, SocketFlags.None); } #endregion } else if (requestType == Message.MessageType.KeepAlive) { #region Keep Alive int peerId; Peer peer; request.GetKeepAlive(out peerId); if (peers.TryGetValue(peerId, out peer)) { Logger.WriteLine("Keep alive is sent by Peer: " + peer); // send KEEP ALIVE message back response = request; handler.Send(response.data, 0, response.data.Length, SocketFlags.None); } else { // send FAIL message that peer is not registered response = Message.CreateMessageFailed(); handler.Send(response.data, 0, response.data.Length, SocketFlags.None); } #endregion } else if (requestType == Message.MessageType.CreateRoom) { #region Create Room int peerId, maxPlayers, listenPort; string roomId; request.GetCreate(out peerId, out maxPlayers, out roomId, out listenPort); Peer peer; if (peers.TryGetValue(peerId, out peer)) { Room room; if (!rooms.TryGetValue(roomId, out room)) { room = new Room(roomId, peer, maxPlayers, listenPort); rooms.Add(roomId, room); Logger.WriteLine("Create room request is sent by peer " + peer + " for room " + room); // send reply message SUCCESS response = Message.CreateMessageSuccess(); handler.Send(response.data, 0, response.data.Length, SocketFlags.None); } else { // send message FAIL that room doesn't exist response = Message.CreateMessageFailed(); handler.Send(response.data, 0, response.data.Length, SocketFlags.None); } } else { // send message FAIL that peer is not registered response = Message.CreateMessageFailed(); handler.Send(response.data, 0, response.data.Length, SocketFlags.None); } #endregion } else if (requestType == Message.MessageType.ListRoom) { #region List Room int peerId; request.GetList(out peerId); Peer peer; if (peers.TryGetValue(peerId, out peer) && !peer.InRoom) { Logger.WriteLine("List room is sent to Peer " + peer); List<Message.MessageRoomBody> listRooms = new List<Message.MessageRoomBody>(); foreach (var r in rooms.Values) { Message.MessageRoomBody mb; mb.roomId = r.Id; mb.maxPlayers = r.MaxPlayers; mb.currentPlayer = r.Members.Count; listRooms.Add(mb); } // send ROOM message response = Message.CreateMessageRoom(listRooms); handler.Send(response.data, 0, response.data.Length, SocketFlags.None); } else { // send message FAIL that peer is not registered response = Message.CreateMessageFailed(); handler.Send(response.data, 0, response.data.Length, SocketFlags.None); } #endregion } else if (requestType == Message.MessageType.Join) { #region Join Room int peerId; string roomId; request.GetJoin(out peerId, out roomId); Peer peer; if (peers.TryGetValue(peerId, out peer) && !peer.InRoom) { Room room; if (rooms.TryGetValue(roomId, out room) && room.Members.Count < room.MaxPlayers) { Logger.WriteLine("Join room request is sent by Peer " + peer + " for Room " + room); // send IP address back to peer response = Message.CreateMessageCreatorInfo(room.Creator.IpAddress, room.ListenPort); handler.Send(response.data, 0, response.data.Length, SocketFlags.None); } else { // send message FAIL that peer is not registered response = Message.CreateMessageFailed(); handler.Send(response.data, 0, response.data.Length, SocketFlags.None); } } else { // send message FAIL that peer is not registered response = Message.CreateMessageFailed(); handler.Send(response.data, 0, response.data.Length, SocketFlags.None); } #endregion } else if (requestType == Message.MessageType.Start) { #region Start int peerId; request.GetList(out peerId); Peer peer; if (peers.TryGetValue(peerId, out peer) && !peer.InRoom) { } else { // send message FAIL that peer is not registered response = Message.CreateMessageFailed(); handler.Send(response.data, 0, response.data.Length, SocketFlags.None); } #endregion } else if (requestType == Message.MessageType.Quit) { #region Quit int peerId; request.GetList(out peerId); Peer peer; if (peers.TryGetValue(peerId, out peer) && !peer.InRoom) { } else { // send message FAIL that peer is not registered response = Message.CreateMessageFailed(); handler.Send(response.data, 0, response.data.Length, SocketFlags.None); } #endregion //} //else if (requestType == Message.MessageType.Add) //{ // #region Add // int peerId; // request.GetList(out peerId); // Peer peer; // if (peers.TryGetValue(peerId, out peer) && !peer.InRoom) // { // // ... // } // else // { // // send message FAIL that peer is not registered // response = Message.CreateMessageFailed(); // handler.Send(response.data, 0, response.data.Length, SocketFlags.None); // } // #endregion } else if (requestType == Message.MessageType.Add) { #region Add int peerId; string roomId; request.GetAdd(out peerId, out roomId); Peer peer; Room room; if (peers.TryGetValue(peerId, out peer) && (rooms.TryGetValue(roomId, out room))) { room.AddPeer(peer); response = Message.CreateMessageSuccess(); handler.Send(response.data, 0, response.data.Length, SocketFlags.None); } else { // send message FAIL that peer is not registered response = Message.CreateMessageFailed(); handler.Send(response.data, 0, response.data.Length, SocketFlags.None); } #endregion } else if (requestType == Message.MessageType.Remove) { #region Remove int peerId; int creatorId; int creatorPort; string roomId; request.GetRemove(out peerId, out creatorId, out creatorPort, out roomId); Room room; if (rooms.TryGetValue(roomId, out room)) { room.RemovePeer(peerId); Peer creator; room.Members.TryGetValue(creatorId, out creator); room.Creator = creator; room.ListenPort = creatorPort; response = Message.CreateMessageSuccess(); handler.Send(response.data, 0, response.data.Length, SocketFlags.None); } else { // send message FAIL that peer is not registered response = Message.CreateMessageFailed(); handler.Send(response.data, 0, response.data.Length, SocketFlags.None); } #endregion } else { Logger.WriteLine("Unknown message received from " + (handler.RemoteEndPoint as IPEndPoint)); // throw message failed response = Message.CreateMessageFailed(); handler.Send(response.data, 0, response.data.Length, SocketFlags.None); } #region Receive for Next Message byte[] buffer = new byte[1024]; obj = new object[2]; obj[0] = buffer; obj[1] = handler; IAsyncResult nextAsyncResult = handler.BeginReceive( buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), obj ); if (!nextAsyncResult.AsyncWaitHandle.WaitOne(Configuration.MaxTimeout)) { Logger.WriteLine("Connection timeout for peer with IP Address " + (handler.LocalEndPoint as IPEndPoint).Address + ":" + (handler.LocalEndPoint as IPEndPoint).Port + " -> " + (handler.RemoteEndPoint as IPEndPoint).Address + ":" + (handler.RemoteEndPoint as IPEndPoint).Port); // find peer id int peerId = 0; foreach (KeyValuePair<int, Peer> entry in peers) { if (entry.Value.IpAddress.Equals((handler.RemoteEndPoint as IPEndPoint).Address)) { peerId = entry.Key; break; } } peers.Remove(peerId); handler.Close(); } #endregion } } catch (SocketException exc) { Logger.WriteLine(exc); } }
public void AddPeer(Peer peer) { peer.InRoom = true; peer.RoomId = Id; Members.Add(peer.Id, peer); }