Форум программистов, компьютерный форум, киберфорум
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. Показов 3219. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия SDL 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual. . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru