public void CancelGame(string gameTitle)
        {
            RemoveMessageFromQueue(BROADCAST_IP, eProtocol.GameCreated);

            NetworkMessage message = new NetworkMessage()
            {
                RecipientsIP = BROADCAST_IP,
                MessagePacket = new NetworkMessagePacket()
                {
                    Command = eProtocol.GameCancelled,
                    MessageText = gameTitle
                }
            };

            AddMessageToQueue(message);
        }
        public void StartGame(string playerIP)
        {
            RemoveMessageFromQueue(BROADCAST_IP, eProtocol.GameCreated);

            NetworkMessage message = new NetworkMessage()
            {
                RecipientsIP = playerIP,
                MessagePacket = new NetworkMessagePacket()
                {
                    Command = eProtocol.StartGame
                }
            };

            AddMessageToQueue(message);
        }
        public void SendReadyToStart(string serverIP)
        {
            NetworkMessage message = new NetworkMessage()
            {
                RecipientsIP = serverIP,
                MessagePacket = new NetworkMessagePacket()
                {
                    Command = eProtocol.ReadyToStart
                }
            };

            AddMessageToQueue(message);
        }
        public void SetActivePlayer(string playerIP, PlayerDetails activePlayer)
        {
            string messageText = Serialiser.SerializeToXml<PlayerDetails>(activePlayer);
            NetworkMessage message = new NetworkMessage()
            {
                RecipientsIP = playerIP,
                MessagePacket = new NetworkMessagePacket()
                {
                    Command = eProtocol.SetActivePlayer,
                    MessageText = messageText
                }
            };

            AddMessageToQueue(message);
        }
        public void SendLetters(string playerIP, GameLetters letters)
        {
            string messageText = Serialiser.SerializeToXml<GameLetters>(letters);
            NetworkMessage message = new NetworkMessage()
            {
                RecipientsIP = playerIP,
                MessagePacket = new NetworkMessagePacket()
                {
                    Command = eProtocol.SendLetters,
                    MessageText = messageText
                }
            };

            AddMessageToQueue(message);
        }
        public void SendPlayersTurnDetails(string serverIP, PlayersTurnDetails iPlayersTurnDetails)
        {
            string messageText = Serialiser.SerializeToXml<PlayersTurnDetails>(iPlayersTurnDetails);

            NetworkMessage message = new NetworkMessage()
            {
                RecipientsIP = serverIP,
                MessagePacket = new NetworkMessagePacket()
                {
                    Command = eProtocol.PlayersTurnDetails,
                    MessageText = messageText
                }
            };

            AddMessageToQueue(message);
        }
        public void ExchangeLetter(TileDetails letter)
        {
            string messageText = Serialiser.SerializeToXml<TileDetails>(letter);
            NetworkMessage message = new NetworkMessage()
            {
                RecipientsIP = IpAddress,
                MessagePacket = new NetworkMessagePacket()
                {
                    Command = eProtocol.ExchangeLetter,
                    MessageText = messageText
                }
            };

            AddMessageToQueue(message);
        }
        public void JoinGame(string creatorsIpAddress, PlayerDetails activePlayer)
        {
            if (!QueueContainsMessage(creatorsIpAddress, eProtocol.GameJoined))
            {
                string messageText = Serialiser.SerializeToXml<PlayerDetails>(activePlayer);
                NetworkMessage message = new NetworkMessage()
                {
                    RecipientsIP = creatorsIpAddress,
                    MessagePacket = new NetworkMessagePacket()
                    {
                        Command = eProtocol.GameJoined,
                        MessageText = messageText
                    }
                };

                AddMessageToQueue(message);
            }
        }
		private void AcknowledgedMessage(string recipientsIP, NetworkMessagePacket messagePacket)
		{
			if (messagePacket.Command != eProtocol.Acknowledge)
			{
				NetworkMessage message = new NetworkMessage()
				{
					RecipientsIP = recipientsIP,
					MessagePacket = new NetworkMessagePacket()
					{
						ID = messagePacket.ID,
						Command = eProtocol.Acknowledge
					}
				};

				AddMessageToQueue(message);
			}
		}
		private void PingAddress(string ipAddressToPing)
		{
			NetworkMessage message = new NetworkMessage()
			{
				RecipientsIP = ipAddressToPing,
				MessagePacket = new NetworkMessagePacket()
				{
					Command = eProtocol.Ping
				}
			};

			AddMessageToQueue(message);
		}
		public async void SendMessageAsync(NetworkMessage message)
		{
			try
			{
				message.SendAttempts++;
				message.TimeStamp = DateTime.Now;
				using (IOutputStream stream = await m_broadcastSocket.GetOutputStreamAsync(new HostName(message.RecipientsIP), GAME_PORT))
				{
					using (DataWriter writer = new DataWriter(stream))
					{
						var data = System.Text.Encoding.UTF8.GetBytes(Serialiser.SerializeToXml<NetworkMessagePacket>(message.MessagePacket));

						writer.WriteBytes(data);
						await writer.StoreAsync();
					}
				}
			}
			catch (Exception ex)
			{
				PostMessage(ex.Message);
			}
		}
		private async void SendMessage(NetworkMessage message)
		{
			await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync
				(CoreDispatcherPriority.Normal, () => { SendMessageAsync(message); });
		}
		protected void AddMessageToQueue(NetworkMessage message)
		{
			if (!Paused)
			{
				lock (m_messageQueueLock)
				{
					m_outstandingMessages.Add(message);
				}
			}
		}