Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
MЫW
 Аватар для phantom96
124 / 109 / 9
Регистрация: 15.02.2013
Сообщений: 538

Socket Send и Recieve

05.05.2013, 18:12. Показов 3201. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
        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? Сколько выставить таймаут чтобы глюка не было?

Добавлено через 7 минут
И ещё немогу зациклить update_table( Если в конец добавляю вызов себя всё просто наглухо виснет(

Добавлено через 4 часа 20 минут
Решил проблему так
C#
1
2
3
4
5
6
7
8
9
10
11
12
        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 превращает мою программу в убийцу ресурсов?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.05.2013, 18:12
Ответы с готовыми решениями:

Socket зависает на втором Recieve
Из-за чего программа (сервер) висит на втором &quot;r_client.Receive(data)&quot; ??? Со стороны клиента второй раз я передаю инфу. ...

Send struct from socket
Здравствуйте, помогите пожалуйста отправить структуру на ++... typedef struct { unsigned int size; unsigned int cmd; ...

Как избежать зависания на Socket.Send()?
Вообщем при большом трафике на сервере (C# Mono Ubuntu 16.04) как я понял если клиент отключается в момент отправки пакета, то весь поток...

2
 Аватар для MegaSinner
99 / 95 / 9
Регистрация: 09.04.2010
Сообщений: 746
05.05.2013, 19:10
я так обычно читаю:
C#
1
2
3
4
5
6
7
8
9
10
11
                String responseData = String.Empty;
                Byte[] bytes = new Byte[1024];
                int i;
                while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
                {
                    responseData = System.Text.Encoding.UTF8.GetString(bytes, 0, i);
                    toolStripStatusLabel1.Text = "Ответ получен.";
                    txtBrowse.Clear();
                    txtBrowse.Text = responseData;
                }
                log(responseData);
0
MЫW
 Аватар для phantom96
124 / 109 / 9
Регистрация: 15.02.2013
Сообщений: 538
05.05.2013, 20:00  [ТС]
С этим разобрался вроде. Изначально надо было UdpClient а не сокет мне использовать...
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
        public string rcon(string gameServerIP, int gameServerPort, string command)
        {
            string result = "";
            UdpClient client = new UdpClient(gameServerIP, gameServerPort);
 
            client.Connect(IPAddress.Parse(gameServerIP), gameServerPort);
            client.Client.ReceiveTimeout = 100;
 
            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.Parse(gameServerIP), 0);
            client.Send(bufferSend, bufferSend.Length);
 
            try{result = Encoding.ASCII.GetString(client.Receive(ref RemoteIpEndPoint)).Replace("\0", "");}
            catch{return "";}
            finally{client.Close();}
            return result;
        }
Работает, обновляет информацию.
Пытаюсь запустить второй поток для ещё одного сервера:
C#
1
2
3
4
5
6
7
8
9
10
        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();
        }
Блин, когда копировал нашёл ошибку)) (bw.IsBusy == true) . Поправил, всё летает!) Спасибо форуму)))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.05.2013, 20:00
Помогаю со студенческими работами здесь

Socket.Send.Receive - Сообщение делится на фрагменты произвольной длины
клиент шлет массив байт(с &lt;eof&gt;), на сервере дописывается имя клиента в начало массива и возвращается клиенту. Почему сообщение не...

Проблема с методом Send у класса System.Net.Sockets.Socket
Привет всем! Вот фрагмент кода: private Socket FSocket; protected override void OnProcess(object message) { try { ...

Сервер продолжает получать пустые сообщения после вызова метода Socket.Send
Есть сервер с сокетом, который выдает ответы на запросы. Связь с ним нормально работает через модем. Необходимо подключиться к нему с...

Socket.Send + Async & Await: свой асинхронный метод отправки данных
Привет. Хочу написать свой асинх. метод для отправки данных при помощи класса Socket и его метода Send. Работать должно так. Есть некий...

Вылет при socket.send()
Когда вызываю сокет.send или BeginSend, то прога тупо вылетает, без ошибок и eceptionoв. Если поставить брекпоинт, то доходит до }...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru