/// <summary> /// Send msg and wait for confirmation /// </summary> /// <param name="msg">Bytes to Sent</param> /// <returns>Message Confirmation</returns> public Message SentForConfirmation(byte[] msg) { waitConfirmation = true; handler.Send(msg); byte[] bytes = new byte[1024]; int bytesRec = handler.Receive(bytes); time = 0; // Message UNOS_Sister.Message msgConfirm = new UNOS_Sister.Message(); msgConfirm.parseMe(bytes); waitConfirmation = false; return(msgConfirm); }
/// <summary> /// Callbacks for Receiving Message from Client and Handle it. /// </summary> private void RecvrMsgCallback() { while (running) { while (waitConfirmation) { }; try { Console.WriteLine(time); if (time >= maxTime) { Close(); running = false; lock (Tracker.ClientHandlers) { Tracker.ClientHandlers.Remove(IP); } break; } byte[] bytes = new byte[1024]; int bytesRec = handler.Receive(bytes); time = 0; // time // Message UNOS_Sister.Message msg = new UNOS_Sister.Message(); msg.parseMe(bytes); Console.WriteLine(bytes[bytes.Length - 1]); Console.WriteLine("Message : {0}", Encoding.ASCII.GetString(bytes, 0, bytesRec)); List<byte> response = new List<byte>(); response.AddRange(Encoding.ASCII.GetBytes("GunbondGame00000000")); UNOS_Sister.Message msgResponse = new UNOS_Sister.Message(); // TO DO INITIAL MESSAGE RESPONSE string log = ""; msgResponse.msgPeerID = PeerID; // Message Handling // Handsake if (msg.msgCode == UNOS_Sister.Message.HANDSHAKE) { response.Add(135); response.AddRange(Encoding.ASCII.GetBytes(PeerID)); ; log += "Handshake from " + (handler.RemoteEndPoint as IPEndPoint).Address.ToString() + ", Peer ID : " + PeerID + "\n"; msgResponse.msgCode = UNOS_Sister.Message.HANDSHAKE; } else if (msg.msgCode == UNOS_Sister.Message.QUIT) // Quit Room { bool found = false; int i = 0; Room room = null; while (!found) { room = Tracker.Rooms.ElementAt(i).Value; foreach (string id in room.PeerIDs) { if (id.Equals(msg.msgPeerID)) { Console.WriteLine("Peer " + msg.msgPeerID + "is found in " + room.getRoomID()); found = true; } } } if (found) { Console.WriteLine("QUIT"); string sRoom = room.getPeerID(); Console.WriteLine("Peer ID : " + sRoom); string s = Tracker.IPPeers[sRoom]; Console.WriteLine("Key : " + s); ClientHandler handlerCreatorPeer = Tracker.ClientHandlers[s]; UNOS_Sister.Message msgConfirmation = msg; msgResponse.msgCode = handlerCreatorPeer.SentForConfirmation(msgConfirmation.Construct()).msgCode; if (msgResponse.msgCode == Message.SUCCESS) { Console.WriteLine("Sukses"); room.PeerIDs.Remove(msg.msgPeerID); if (room.PeerIDs.Count == 0) Tracker.Rooms.Remove(room.getRoomID()); } else if (msgResponse.msgCode == Message.FAILED) { Console.WriteLine("Failed"); } else { Console.WriteLine("APA ? " + msgResponse.msgCode); msgResponse.msgCode = Message.FAILED; } } else msgResponse.msgCode = UNOS_Sister.Message.FAILED; Console.WriteLine("Quit Room"); } else if (msg.msgCode == UNOS_Sister.Message.START) // Start Room { Room sRoom = Tracker.GetRoom(msg.msgPeerID); if (sRoom != null) { msgResponse.msgCode = UNOS_Sister.Message.SUCCESS; foreach (string id in sRoom.PeerIDs) { if (!id.Equals(msg.msgPeerID)) { Console.WriteLine("Sent Start to : " + id); if (Tracker.IPPeers.ContainsKey(id)) { if (Tracker.ClientHandlers.ContainsKey(Tracker.IPPeers[id])) { Tracker.ClientHandlers[Tracker.IPPeers[id]].handler.Send(msg.Construct()); Console.WriteLine("Sent"); } } } } Thread.Sleep(500); } else { msgResponse.msgCode = UNOS_Sister.Message.FAILED; } Console.WriteLine("Start Room"); } else if (msg.msgCode == UNOS_Sister.Message.KEEP_ALIVE) // Keep Alive { //response = "OK, I will not kill you this time"; msgResponse.msgCode = UNOS_Sister.Message.SUCCESS; log += PeerID + ":" + "Still Alive\n"; time = 0; } else if (msg.msgCode == UNOS_Sister.Message.LIST) // Listing Room { //response = "Oke list of room will be sent sooon"; log += PeerID + ":" + "Request List of Room\n"; msgResponse.msgCode = UNOS_Sister.Message.ROOM; msgResponse.Rooms.Clear(); msgResponse.Rooms.AddRange(Tracker.Rooms.Values); } else if (msg.msgCode == UNOS_Sister.Message.CREATE_ROOM) //Create Room { // Create Room // response = "Oke Room will be created"; if (Tracker.Rooms.Count() + 1 <= Tracker.max_room) { msgResponse.msgCode = UNOS_Sister.Message.SUCCESS; response.Add(127); msg.printMsg(); lock (Tracker.Rooms) { Console.WriteLine("Peer ID :" + msg.msgPeerID); msg.Rooms.ElementAt(0).PeerIDs.Add(msg.msgPeerID); Tracker.Rooms.Add(msg.Rooms[0].getRoomID(), msg.Rooms.ElementAt(0)); } } else { response.Add(128); msgResponse.msgCode = UNOS_Sister.Message.FAILED; } Console.WriteLine("Max Player :" + msg.Rooms[0].getMaxPlayer()); log += PeerID + ":" + "Created Room ID :" + msg.Rooms[0].getRoomID().Substring(0, msg.Rooms[0].getRoomID().IndexOf('\0')) + ", MaxPlayer :" + msg.Rooms[0].getMaxPlayer().ToString() + "\n"; Console.WriteLine(log); } else if (msg.msgCode == Message.JOIN) // Join Room { Console.WriteLine("Join Room"); Console.WriteLine("Room ID : " + msg.Rooms[0].getRoomID()); string sRoom = Tracker.Rooms[msg.Rooms[0].getRoomID()].getPeerID(); if (sRoom != null) { Console.WriteLine("Peer ID : " + sRoom); string s = Tracker.IPPeers[sRoom]; Console.WriteLine("Key : " + s); ClientHandler handlerCreatorPeer = Tracker.ClientHandlers[s]; UNOS_Sister.Message msgConfirmation = new UNOS_Sister.Message(); msgConfirmation.msgCode = Message.CHECK; msgConfirmation.msgPeerID = msg.msgPeerID; msgConfirmation.IP = this.IP; msgResponse.msgCode = handlerCreatorPeer.SentForConfirmation(msgConfirmation.Construct()).msgCode; if (msgResponse.msgCode == Message.SUCCESS) { Console.WriteLine("Sukses"); Room room = Tracker.Rooms[msg.Rooms[0].getRoomID()]; room.PeerIDs.Add(msg.msgPeerID); } else if (msgResponse.msgCode == Message.FAILED) { Console.WriteLine("Failed"); } else { Console.WriteLine("APA ? " + msgResponse.msgCode); msgResponse.msgCode = Message.FAILED; } } else { Room room = Tracker.Rooms[msg.Rooms[0].getRoomID()]; room.PeerIDs.Add(msg.msgPeerID); msgResponse.msgCode = Message.SUCCESS; } } response.Clear(); Console.WriteLine("Message to Write : " + msgResponse.msgCode); response.AddRange(msgResponse.Construct()); if (Tracker.log) { Console.WriteLine("Write Log"); lock (Tracker.fileLog) { Tracker.fileLog.Write(Encoding.ASCII.GetBytes(log), 0, log.Length); Tracker.fileLog.Write(Encoding.ASCII.GetBytes("->"), 0, 2); Tracker.fileLog.Write(response.ToArray(), 0, response.Count); Tracker.fileLog.Write(Encoding.ASCII.GetBytes("\n"), 0, 1); } if (Tracker.LogText != null) { lock (Tracker.LogText) { del update_log_text = new del(() => { Tracker.LogText.Text += log; Tracker.LogText.Text += "->" + Encoding.ASCII.GetString(response.ToArray()) + "\n"; }); Tracker.LogText.Invoke(update_log_text); } } } // Send Response handler.Send(response.ToArray()); } catch (SocketException se) { running = false; lock (Tracker.ClientHandlers) { Tracker.ClientHandlers.Remove(IP); } } } }
/// <summary> /// Send msg and wait for confirmation /// </summary> /// <param name="msg">Bytes to Sent</param> /// <returns>Message Confirmation</returns> public Message SentForConfirmation(byte[] msg) { waitConfirmation = true; handler.Send(msg); byte[] bytes = new byte[1024]; int bytesRec = handler.Receive(bytes); time = 0; // Message UNOS_Sister.Message msgConfirm = new UNOS_Sister.Message(); msgConfirm.parseMe(bytes); waitConfirmation = false; return msgConfirm; }
/// <summary> /// Callbacks for Receiving Message from Client and Handle it. /// </summary> private void RecvrMsgCallback() { while (running) { while (waitConfirmation) { } ; try { Console.WriteLine(time); if (time >= maxTime) { Close(); running = false; lock (Tracker.ClientHandlers) { Tracker.ClientHandlers.Remove(IP); } break; } byte[] bytes = new byte[1024]; int bytesRec = handler.Receive(bytes); time = 0; // time // Message UNOS_Sister.Message msg = new UNOS_Sister.Message(); msg.parseMe(bytes); Console.WriteLine(bytes[bytes.Length - 1]); Console.WriteLine("Message : {0}", Encoding.ASCII.GetString(bytes, 0, bytesRec)); List <byte> response = new List <byte>(); response.AddRange(Encoding.ASCII.GetBytes("GunbondGame00000000")); UNOS_Sister.Message msgResponse = new UNOS_Sister.Message(); // TO DO INITIAL MESSAGE RESPONSE string log = ""; msgResponse.msgPeerID = PeerID; // Message Handling // Handsake if (msg.msgCode == UNOS_Sister.Message.HANDSHAKE) { response.Add(135); response.AddRange(Encoding.ASCII.GetBytes(PeerID));; log += "Handshake from " + (handler.RemoteEndPoint as IPEndPoint).Address.ToString() + ", Peer ID : " + PeerID + "\n"; msgResponse.msgCode = UNOS_Sister.Message.HANDSHAKE; } else if (msg.msgCode == UNOS_Sister.Message.QUIT) // Quit Room { bool found = false; int i = 0; Room room = null; while (!found) { room = Tracker.Rooms.ElementAt(i).Value; foreach (string id in room.PeerIDs) { if (id.Equals(msg.msgPeerID)) { Console.WriteLine("Peer " + msg.msgPeerID + "is found in " + room.getRoomID()); found = true; } } } if (found) { Console.WriteLine("QUIT"); string sRoom = room.getPeerID(); Console.WriteLine("Peer ID : " + sRoom); string s = Tracker.IPPeers[sRoom]; Console.WriteLine("Key : " + s); ClientHandler handlerCreatorPeer = Tracker.ClientHandlers[s]; UNOS_Sister.Message msgConfirmation = msg; msgResponse.msgCode = handlerCreatorPeer.SentForConfirmation(msgConfirmation.Construct()).msgCode; if (msgResponse.msgCode == Message.SUCCESS) { Console.WriteLine("Sukses"); room.PeerIDs.Remove(msg.msgPeerID); if (room.PeerIDs.Count == 0) { Tracker.Rooms.Remove(room.getRoomID()); } } else if (msgResponse.msgCode == Message.FAILED) { Console.WriteLine("Failed"); } else { Console.WriteLine("APA ? " + msgResponse.msgCode); msgResponse.msgCode = Message.FAILED; } } else { msgResponse.msgCode = UNOS_Sister.Message.FAILED; } Console.WriteLine("Quit Room"); } else if (msg.msgCode == UNOS_Sister.Message.START) // Start Room { Room sRoom = Tracker.GetRoom(msg.msgPeerID); if (sRoom != null) { msgResponse.msgCode = UNOS_Sister.Message.SUCCESS; foreach (string id in sRoom.PeerIDs) { if (!id.Equals(msg.msgPeerID)) { Console.WriteLine("Sent Start to : " + id); if (Tracker.IPPeers.ContainsKey(id)) { if (Tracker.ClientHandlers.ContainsKey(Tracker.IPPeers[id])) { Tracker.ClientHandlers[Tracker.IPPeers[id]].handler.Send(msg.Construct()); Console.WriteLine("Sent"); } } } } Thread.Sleep(500); } else { msgResponse.msgCode = UNOS_Sister.Message.FAILED; } Console.WriteLine("Start Room"); } else if (msg.msgCode == UNOS_Sister.Message.KEEP_ALIVE) // Keep Alive { //response = "OK, I will not kill you this time"; msgResponse.msgCode = UNOS_Sister.Message.SUCCESS; log += PeerID + ":" + "Still Alive\n"; time = 0; } else if (msg.msgCode == UNOS_Sister.Message.LIST) // Listing Room { //response = "Oke list of room will be sent sooon"; log += PeerID + ":" + "Request List of Room\n"; msgResponse.msgCode = UNOS_Sister.Message.ROOM; msgResponse.Rooms.Clear(); msgResponse.Rooms.AddRange(Tracker.Rooms.Values); } else if (msg.msgCode == UNOS_Sister.Message.CREATE_ROOM) //Create Room { // Create Room // response = "Oke Room will be created"; if (Tracker.Rooms.Count() + 1 <= Tracker.max_room) { msgResponse.msgCode = UNOS_Sister.Message.SUCCESS; response.Add(127); msg.printMsg(); lock (Tracker.Rooms) { Console.WriteLine("Peer ID :" + msg.msgPeerID); msg.Rooms.ElementAt(0).PeerIDs.Add(msg.msgPeerID); Tracker.Rooms.Add(msg.Rooms[0].getRoomID(), msg.Rooms.ElementAt(0)); } } else { response.Add(128); msgResponse.msgCode = UNOS_Sister.Message.FAILED; } Console.WriteLine("Max Player :" + msg.Rooms[0].getMaxPlayer()); log += PeerID + ":" + "Created Room ID :" + msg.Rooms[0].getRoomID().Substring(0, msg.Rooms[0].getRoomID().IndexOf('\0')) + ", MaxPlayer :" + msg.Rooms[0].getMaxPlayer().ToString() + "\n"; Console.WriteLine(log); } else if (msg.msgCode == Message.JOIN) // Join Room { Console.WriteLine("Join Room"); Console.WriteLine("Room ID : " + msg.Rooms[0].getRoomID()); string sRoom = Tracker.Rooms[msg.Rooms[0].getRoomID()].getPeerID(); if (sRoom != null) { Console.WriteLine("Peer ID : " + sRoom); string s = Tracker.IPPeers[sRoom]; Console.WriteLine("Key : " + s); ClientHandler handlerCreatorPeer = Tracker.ClientHandlers[s]; UNOS_Sister.Message msgConfirmation = new UNOS_Sister.Message(); msgConfirmation.msgCode = Message.CHECK; msgConfirmation.msgPeerID = msg.msgPeerID; msgConfirmation.IP = this.IP; msgResponse.msgCode = handlerCreatorPeer.SentForConfirmation(msgConfirmation.Construct()).msgCode; if (msgResponse.msgCode == Message.SUCCESS) { Console.WriteLine("Sukses"); Room room = Tracker.Rooms[msg.Rooms[0].getRoomID()]; room.PeerIDs.Add(msg.msgPeerID); } else if (msgResponse.msgCode == Message.FAILED) { Console.WriteLine("Failed"); } else { Console.WriteLine("APA ? " + msgResponse.msgCode); msgResponse.msgCode = Message.FAILED; } } else { Room room = Tracker.Rooms[msg.Rooms[0].getRoomID()]; room.PeerIDs.Add(msg.msgPeerID); msgResponse.msgCode = Message.SUCCESS; } } response.Clear(); Console.WriteLine("Message to Write : " + msgResponse.msgCode); response.AddRange(msgResponse.Construct()); if (Tracker.log) { Console.WriteLine("Write Log"); lock (Tracker.fileLog) { Tracker.fileLog.Write(Encoding.ASCII.GetBytes(log), 0, log.Length); Tracker.fileLog.Write(Encoding.ASCII.GetBytes("->"), 0, 2); Tracker.fileLog.Write(response.ToArray(), 0, response.Count); Tracker.fileLog.Write(Encoding.ASCII.GetBytes("\n"), 0, 1); } if (Tracker.LogText != null) { lock (Tracker.LogText) { del update_log_text = new del(() => { Tracker.LogText.Text += log; Tracker.LogText.Text += "->" + Encoding.ASCII.GetString(response.ToArray()) + "\n"; }); Tracker.LogText.Invoke(update_log_text); } } } // Send Response handler.Send(response.ToArray()); } catch (SocketException se) { running = false; lock (Tracker.ClientHandlers) { Tracker.ClientHandlers.Remove(IP); } } } }