Пример #1
0
            /// <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);
            }
Пример #2
0
            /// <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);
                        }
                    }
                }
            }
Пример #3
0
            /// <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;
            }
Пример #4
0
            /// <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);
                        }
                    }
                }
            }