Socket Send и Recieve - C#

Узнай цену своей работы

Формулировка задачи:

        private void update_table()
        {
            Stopwatch sw = new Stopwatch();
            sw.Start();
            string[] status = rcon("83.221.178.248", 28960, "getstatus").Split(new string[] { "\n" }, StringSplitOptions.None);
            if (status[0] != "0")
            {
                datagrid.Items.Clear();
                for (int i = 2; i < status.Length - 1; i++)
                {
                    string[] player = status[i].Split(new string[] {"\""}, StringSplitOptions.None);
                    string[] ints = player[0].Split(del, StringSplitOptions.None);
                    Person item = new Person()
                    {
                        Name = player[1].Replace("\"", ""),
                        Ping = Convert.ToInt32(ints[1]),
                        Score = Convert.ToInt32(ints[0])
                    };
                    Person data = item;
                    datagrid.Items.Add(data);
                }
                if (datagrid.Items.SortDescriptions.Count == 0) datagrid.Items.SortDescriptions.Add(new SortDescription("Score", ListSortDirection.Descending));
                else
                {
                    SortDescription sd = datagrid.Items.SortDescriptions[0];
                    datagrid.Items.SortDescriptions.Clear();
                    datagrid.Items.SortDescriptions.Add(sd);
                }
            }
            sw.Stop();
            System.Windows.MessageBox.Show(sw.ElapsedMilliseconds.ToString());
        }

        public string rcon(string gameServerIP, int gameServerPort, string command)
        {
            Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            client.SendTimeout = 1;
            client.ReceiveTimeout = 1;
 
            client.Connect(IPAddress.Parse(gameServerIP), gameServerPort);
 
            Byte[] bufferTemp = Encoding.ASCII.GetBytes(command);
            Byte[] bufferSend = new Byte[bufferTemp.Length + 5];
 
            bufferSend[0] = Byte.Parse("255");
            bufferSend[1] = Byte.Parse("255");
            bufferSend[2] = Byte.Parse("255");
            bufferSend[3] = Byte.Parse("255");
            bufferSend[4] = Byte.Parse("02");
 
            int j = 5;
 
            for (int i = 0; i < bufferTemp.Length; i++)
            {
                bufferSend[j] = bufferTemp[i];
                j++;
            }
 
            IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);
            client.Send(bufferSend, SocketFlags.None);
 
            Byte[] bufferRec = new Byte[64999];
            try
            {
                client.Receive(bufferRec);
            }
            catch { return "0"; }
            finally
            {
                client.Close();
            }
            string result = Encoding.ASCII.GetString(bufferRec).Replace("\0", "");
            return result;
        }
    }
Пакеты доходят примерно в 30%. Если доходят время на функцию ~90 мс. Если не доходят ~500. Откуда 500? Сколько выставить таймаут чтобы глюка не было?
И ещё немогу зациклить update_table( Если в конец добавляю вызов себя всё просто наглухо виснет(
Решил проблему так
        void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (bw.IsBusy == false)
            bw.RunWorkerAsync();
            else
            {
                while (bw.IsBusy == true)
                    Thread.Sleep(2);
                if (bw.IsBusy == false)
                    bw.RunWorkerAsync();
            }
        }
Скажите пожалуйста насколько Sleep 2 превращает мою программу в убийцу ресурсов?

Решение задачи: «Socket Send и Recieve»

textual
Листинг программы
        public MainWindow()
        {
            InitializeComponent();
            bw.DoWork += (s, e) => update("83.221.178.248", 28960, datagrid);
            bw.RunWorkerCompleted += (s, e) => { while (bw.IsBusy == true) Thread.Sleep(2); bw.RunWorkerAsync(); };
            bw.RunWorkerAsync();
            bw2.DoWork += (s, e) => update("127.0.0.1", 28960, datagrid_Copy);
            bw2.RunWorkerCompleted += (s, e) => { while (bw.IsBusy == true) Thread.Sleep(2); bw2.RunWorkerAsync(); };
            bw2.RunWorkerAsync();
        }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4 из 5