private void ProcessMessages(Message msg) { Logger.WriteLine("MAAAAAAAAASSSSSSSSSUU"); float xPos; // x position float yPos; // y position float power; // power float angle; // angle float life; // damage bool isRocketFlying; int PeerID; msg.GetMessageGame(out xPos, out yPos, out angle, out power, out life, out isRocketFlying, out PeerID); currentPlayer.Position.X = xPos; currentPlayer.Position.Y = yPos; currentPlayer.Power = power; currentPlayer.Angle = angle; rocketFlying = isRocketFlying; //rocketDamage = damage; currentPlayer.Health = life; if (isRocketFlying) { rocketPosition = currentPlayer.Position; rocketPosition.X += 20; rocketPosition.Y -= 10; rocketAngle = currentPlayer.Angle; Vector2 up = new Vector2(0, -1); Matrix rotMatrix = Matrix.CreateRotationZ(rocketAngle); rocketDirection = Vector2.Transform(up, rotMatrix); rocketDirection *= currentPlayer.Power / 50.0f; } Logger.WriteLine("-----------------"); Logger.WriteLine("players" + currentPlayer + PeerID); Logger.WriteLine(currentPlayer.Position.X); Logger.WriteLine(currentPlayer.Position.Y); Logger.WriteLine(currentPlayer.Power); Logger.WriteLine(currentPlayer.Angle); Logger.WriteLine("Rocket status:" + isRocketFlying); Logger.WriteLine(currentPlayer.Health); Logger.WriteLine("-----------------"); }
private void ReceiveCallback(IAsyncResult target) { Logger.WriteLine("--- ReceiveCallback"); Message.MessageType requestType = Message.MessageType.Unknown; Socket handler = null; try { object[] obj = new object[2]; obj = (object[])target.AsyncState; byte[] buffer = (byte[])obj[0]; handler = (Socket)obj[1]; //Logger.WriteLine("ReceiveCallback from " + (handler.RemoteEndPoint as IPEndPoint).Address + ":" + (handler.RemoteEndPoint as IPEndPoint).Port); Logger.WriteLine("Message from " + (handler.RemoteEndPoint as IPEndPoint).Address + ":" + (handler.RemoteEndPoint as IPEndPoint).Port); bool quit = false; int bytesRead = handler.EndReceive(target); if (bytesRead > 0) { Logger.WriteLine("Message to " + (handler.LocalEndPoint as IPEndPoint).Address + ":" + (handler.LocalEndPoint as IPEndPoint).Port); Logger.WriteLine("Message content: \n----------------------------\n"); StringBuilder hex = new StringBuilder(buffer.Length * 2); for (int i = 0; i < bytesRead; i++) hex.AppendFormat("{0:x2}", buffer[i]); Logger.WriteLine(hex + "\n----------------------------"); Message request = new Message(buffer); Message response; requestType = request.GetMessageType(); if (requestType == Message.MessageType.HandshakePeerCreator) // Peer client mau join ke room ini { #region Handshake Logger.WriteLine("HandshakePeerCreator"); if (Room.Members.Count < Room.MaxPlayer) { int newPeerId, newPeerListenPort; IPAddress newPeerIp = (handler.RemoteEndPoint as IPEndPoint).Address; request.GetHandshakePeerCreator(out newPeerId, out newPeerListenPort); Room.Members.Add(new Peer(newPeerId, newPeerIp, newPeerListenPort)); //Logger.WriteLine("Peer ID : " + newPeerId); //Logger.WriteLine("Peer IP : " + newPeerIp + ":" + newPeerListenPort); Logger.WriteLine("Handshake from:" + newPeerIp + "is sent to " + (handler.LocalEndPoint as IPEndPoint).Address); // Send SUCCESS message response = Message.CreateMessageSuccess(); handler.Send(response.data, 0, response.data.Length, SocketFlags.None); if (nextPeerSocket != null) { Logger.WriteLine("Sending NEW MEMBER to nextPeerSocket: " + (nextPeerSocket.RemoteEndPoint as IPEndPoint).Address + ":" + (nextPeerSocket.RemoteEndPoint as IPEndPoint).Port); // Send NewMember message to next peer response = Message.CreateMessageNewMember(newPeerId, (handler.RemoteEndPoint as IPEndPoint).Address, newPeerListenPort); nextPeerSocket.Send(response.data, 0, response.data.Length, SocketFlags.None); } else { IPEndPoint ipEndPoint = new IPEndPoint(newPeerIp, newPeerListenPort); nextPeerSocket = new Socket( newPeerIp.AddressFamily, SocketType.Stream, ProtocolType.Tcp ); nextPeerSocket.NoDelay = false; nextPeerSocket.Connect(ipEndPoint); Logger.WriteLine("Setting up nextPeerSocket to " + (nextPeerSocket.RemoteEndPoint as IPEndPoint).Address + ":" + (nextPeerSocket.RemoteEndPoint as IPEndPoint).Port); response = Message.CreateMessageRoomModel(Room); nextPeerSocket.Send(response.data, 0, response.data.Length, SocketFlags.None); Logger.WriteLine("Send room info"); keepAliveRoom = new Thread(new ThreadStart(SendAliveNextPeer)); keepAliveRoom.Start(); } response = Message.CreateMessageAdd(newPeerId, Room.RoomId); lock (trackerPaddle) { trackerSocket.Send(response.data, 0, response.data.Length, SocketFlags.None); byte[] bufferRecv = new byte[1024]; trackerSocket.Receive(bufferRecv, 0, bufferRecv.Length, SocketFlags.None); } } else { Logger.WriteLine("Send FAILED: Room penuh"); // Send FAILED message akibat ruang penuh response = Message.CreateMessageFailed(); handler.Send(response.data, 0, response.data.Length, SocketFlags.None); handler.Close(); quit = true; } #endregion } else if (requestType == Message.MessageType.KeepAlive) { #region Keep Alive int peerId; request.GetKeepAlive(out peerId); Peer peer = Room.Members.Find(fpeer => fpeer.PeerId == peerId); if (peer != null) { //Send KeepAlive Message back response = request; handler.Send(response.data, 0, response.data.Length, SocketFlags.None); } else { response = Message.CreateMessageFailed(); handler.Send(response.data, 0, response.data.Length, SocketFlags.None); } #endregion } else if (requestType == Message.MessageType.NewMember) { #region NewMember Logger.WriteLine("NewMember"); if (IsCreator) { Logger.WriteLine("NEW MEMBER has been received by peer creator"); Logger.WriteLine("Closing connection from " + (handler.RemoteEndPoint as IPEndPoint).Address + ":" + (handler.RemoteEndPoint as IPEndPoint).Port); handler.Close(); quit = true; } else { bool isLast = Room.Members.Last().PeerId == PeerId; int newPeerId, newPeerListenPort; IPAddress newPeerIp; request.GetNewMember(out newPeerId, out newPeerIp, out newPeerListenPort); Room.Members.Add(new Peer(newPeerId, newPeerIp, newPeerListenPort)); Logger.WriteLine("Sending NEW MEMBER to nextPeerSocket: " + (nextPeerSocket.RemoteEndPoint as IPEndPoint).Address + ":" + (nextPeerSocket.RemoteEndPoint as IPEndPoint).Port); Logger.WriteLine("NEW MEMBER has been sent from: " + (nextPeerSocket.LocalEndPoint as IPEndPoint).Address + ":" + (nextPeerSocket.LocalEndPoint as IPEndPoint).Port); response = request; nextPeerSocket.Send(response.data, 0, response.data.Length, SocketFlags.None); if (isLast) { Logger.WriteLine("Closing connection " + (nextPeerSocket.RemoteEndPoint as IPEndPoint).Address + ":" + (nextPeerSocket.RemoteEndPoint as IPEndPoint).Port); nextPeerSocket.Close(); IPEndPoint ipEndPoint = new IPEndPoint(newPeerIp, newPeerListenPort); nextPeerSocket = new Socket( newPeerIp.AddressFamily, SocketType.Stream, ProtocolType.Tcp ); nextPeerSocket.NoDelay = false; nextPeerSocket.Connect(ipEndPoint); Logger.WriteLine("Setting up nextPeerSocket to " + (nextPeerSocket.RemoteEndPoint as IPEndPoint).Address + ":" + (nextPeerSocket.RemoteEndPoint as IPEndPoint).Port); response = Message.CreateMessageRoomModel(Room); nextPeerSocket.Send(response.data, 0, response.data.Length, SocketFlags.None); Logger.WriteLine("Send room info"); } } #endregion } else if (requestType == Message.MessageType.RoomModel) { #region Room Logger.WriteLine("RoomModel"); Room room; request.GetRoomModel(out room); Room = room; #endregion } else if (requestType == Message.MessageType.Start) { #region Start int peerId; string roomId; List<int> teamA; List<int> teamB; request.GetStart(out peerId, out roomId, out teamA, out teamB); if (PeerId != peerId) { if (StartEvent != null) { StartEvent(request); } response = request; nextPeerSocket.Send(response.data, 0, response.data.Length, SocketFlags.None); } #endregion } else if (requestType == Message.MessageType.Quit) { #region Quit int peerId; request.GetQuit(out peerId); Peer peer = Room.Members.Find(fpeer => fpeer.PeerId == peerId); byte[] bufferRecv; if (Room.Members.Count != 2) { if (PeerId == peerId) { Logger.WriteLine("Quit done"); } else { int i = 0; for (; i < Room.Members.Count; i++) {// i adalah indeks peer yang ingin quit if (Room.Members[i].PeerId == peerId) { break; } } int j = 0; for (; j < Room.Members.Count; j++) {// j adalah indeks current peer if (Room.Members[j].PeerId == PeerId) { break; } } if (j == i + 1 || (j == 0 && i == Room.Members.Count - 1)) // yg mau quit adalah peer sebelum current peer { quit = true; } response = request; lock (nextPeerPaddle) { nextPeerSocket.Send(response.data, 0, response.data.Length, SocketFlags.None); Logger.WriteLine("Forward Quit to " + (nextPeerSocket.RemoteEndPoint as IPEndPoint).Address); bufferRecv = new byte[1024]; nextPeerSocket.Receive(bufferRecv, 0, bufferRecv.Length, SocketFlags.None); } if (i == j + 1 || (i == 0 && j == Room.Members.Count - 1))// yg mau quit adalah peer setelah current peer { nextPeerSocket.Close(); IPAddress ip = Room.Members[(i + 1) % (Room.Members.Count - 1)].IPAddress; IPEndPoint ipEndPoint = new IPEndPoint(ip, Room.Members[(i + 1) % (Room.Members.Count - 1)].ListeningPort); nextPeerSocket = new Socket( ip.AddressFamily, SocketType.Stream, ProtocolType.Tcp ); nextPeerSocket.NoDelay = false; nextPeerSocket.Connect(ipEndPoint); nextPeerSocket = null; } if (this.PeerId == Room.Creator.PeerId || (peerId == Room.Creator.PeerId && Room.Members[1].PeerId == this.PeerId)) { lock (trackerPaddle) { response = Message.CreateMessageRemove(peerId, PeerId, Configuration.ListenPort, Room.RoomId); trackerSocket.Send(response.data, 0, response.data.Length, SocketFlags.None); bufferRecv = new byte[1024]; trackerSocket.Receive(bufferRecv, 0, bufferRecv.Length, SocketFlags.None); } } if (peerId == Room.Creator.PeerId) { Room.Creator = Room.Members[1]; } response = Message.CreateMessageSuccess(); handler.Send(response.data, 0, response.data.Length, SocketFlags.None); bufferRecv = new byte[1024]; nextPeerSocket.Receive(bufferRecv, 0, bufferRecv.Length, SocketFlags.None); } } else { lock (trackerPaddle) { response = Message.CreateMessageRemove(peerId, PeerId, Configuration.ListenPort, Room.RoomId); trackerSocket.Send(response.data, 0, response.data.Length, SocketFlags.None); bufferRecv = new byte[1024]; trackerSocket.Receive(bufferRecv, 0, bufferRecv.Length, SocketFlags.None); } } Room.Members.Remove(peer); #endregion } else if (requestType == Message.MessageType.InGame) { float x, y, angle, power, damage; bool isRocketFlying; int peerId; request.GetMessageGame(out x, out y, out angle, out power, out damage, out isRocketFlying, out peerId); if (peerId != PeerId) { if (GameEvent != null) { GameEvent(request); } response = request; nextPeerSocket.Send(response.data, 0, response.data.Length, SocketFlags.None); } } } if (!quit) { 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); Logger.WriteLine("Closing connection " + (handler.RemoteEndPoint as IPEndPoint).Address + ":" + (handler.RemoteEndPoint as IPEndPoint).Port); handler.Close(); } } } catch (SocketException exc) { Logger.WriteLine(exc); if (exc.SocketErrorCode == SocketError.HostDown || exc.SocketErrorCode == SocketError.ConnectionReset) { if (Room.Members.Count > 2) { int index = -1; for (int i = 0; i < Room.Members.Count; i++) { Peer p = Room.Members[i]; if (p.IPAddress.Equals((handler.LocalEndPoint as IPEndPoint).Address)) { index = i; } } if (index == 0) { index = Room.Members.Count - 2; } else { index--; } Peer backPeer = Room.Members[index]; byte[] buffer = new byte[1024]; Message request = Message.CreateMessageQuit(backPeer.PeerId); lock (nextPeerPaddle) { nextPeerSocket.Send(request.data, 0, request.data.Length, SocketFlags.None); nextPeerSocket.Receive(buffer, 0, buffer.Length, SocketFlags.None); } } else { // Remove last element Room.Members.RemoveAt(1); lock (nextPeerPaddle) { nextPeerSocket = null; } } } } Logger.WriteLine(); }