Exemple #1
0
        private SimhoppMessage SendReceive(SimhoppMessage msg = null, bool broadcast = false)
        {
            byte[]         data;
            string         responseData;
            SimhoppMessage responseMsg;

            if (msg == null && !Messages.TryDequeue(out msg))
            {
                try
                {
                    client.Client.ReceiveTimeout = 1000;
                    data         = client.Receive(ref ipep);
                    responseData = Encoding.ASCII.GetString(data);

                    responseMsg = SimhoppMessage.Deserialize(responseData);

                    return(responseMsg);
                }
                catch (Exception)
                {
                    return(null);
                }
            }

            if (msg == null)
            {
                return(null);
            }

            data = Encoding.ASCII.GetBytes(msg.Serialize());

            int tries = 0;

            while (true)
            {
                tries++;
                try
                {
                    //Öka timeout för vaje försök
                    client.Client.ReceiveTimeout = 1000 + Math.Min(tries * 100, 10000);

                    if (broadcast)
                    {
                        data = Encoding.ASCII.GetBytes(SimhoppMessage.PingMessage().Serialize());
                        client.Send(data, data.Length, new IPEndPoint(IPAddress.Broadcast, 60069));
                    }
                    else
                    {
                        client.Send(data, data.Length, ipep);
                    }
                    data = client.Receive(ref ipep);
                    break;
                }
                catch (SocketException ex)
                {
                    LogMessage(SimhoppMessage.ErrorMessage(Encoding.ASCII.GetString(data)));
                    ExceptionHandler.Handle(ex);
                }
            }

            responseData = Encoding.ASCII.GetString(data);
            responseMsg  = SimhoppMessage.Deserialize(responseData);

            return(responseMsg);
        }