Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 01.04.2021
Сообщений: 82

Обмен данными по сокету: данные не поступают

10.09.2024, 18:48. Показов 829. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброе время суток
Подскажите, пожалуйста, что я делаю не правильно?

Сервер
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
77
78
79
80
81
82
83
84
85
86
87
88
public class UDPServer
    {
        #region Поля
        private Socket? serverSocket;
        private EndPoint? epRecieve;
        private int portServer;
 
 
        private readonly Object _Lock = new();
 
        private bool _Enabled;
        #endregion
 
        #region Свойства
        public bool Enabled { get => _Enabled; set { if (value) Start(); else Stop(); } }
        public int PortServer { get => portServer; set => portServer = value; }
 
        #endregion
 
        public void Start()
        {
            if (_Enabled) return;
 
            lock (_Lock)
            {
                if (_Enabled) return; 
                epRecieve = new IPEndPoint(IPAddress.Any, PortServer); 
                serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
                serverSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.PacketInformation, true);
                serverSocket.Bind(epRecieve);
 
                _Enabled = true;
                Listening();
            }
 
 
        }
 
        public void Stop()
        {
            if (!_Enabled) return;
 
            lock (_Lock)
            {
                if (!_Enabled) return;
 
                _Enabled = false;
            }
        }
 
        private void Listening()
        {
            Task.Run( () =>
            {
                EndPoint endPoint = new IPEndPoint(IPAddress.Any, 0);
                var flag = SocketFlags.None;
                int bytes_received;
 
                byte[] buffer = new byte[30];
                ArraySegment<byte> dataBufferSegments = new(); 
 
                try
                {    
                    while (_Enabled)
                    {
                        WriteLine("Ожидаю пакеты данных... ");
                        bytes_received = serverSocket.ReceiveMessageFrom(dataBufferSegments, ref flag,
                                            ref endPoint, out IPPacketInformation epRecieve);
 
                        WriteLine($"bytes {bytes_received}");
                        var sb1 = new StringBuilder("{ ");
                        foreach (var b in buffer)
                        {
                            sb1.Append(b.ToString("X2") + ", ");
                        }
                        sb1.Append(" }");
                        WriteLine($"Запрос от клиента ({endPoint.ToString()}) :\n  {sb1.ToString()}");
                    }
                }
                catch
                {
                    throw new Exception("Ошибка прослушки порта сервером");
                } 
            }
            );  
        }
 
    }
Клиент
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
77
78
79
80
public class UDPClient
{
    #region Поля
    private Socket? clientSocket;
    private EndPoint? epRecieve;
 
    private string ipSend = string.Empty;
    private int port; 
 
    private byte[]? dataBuffer;
    private ArraySegment<byte> dataBufferSegments;
    #endregion
 
    #region Свойства
    public string IpSend { get => ipSend; set => ipSend = value; }
    public int Port { get => port; set => port = value; }      
    #endregion
 
    public void Initialize()
    {
        dataBuffer = new byte[30];
        dataBufferSegments = new ArraySegment<byte>();
 
        epRecieve = new IPEndPoint(IPAddress.Any,0);
 
        clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        clientSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.PacketInformation, true);
        clientSocket.Bind(epRecieve);
 
        Listen();
    }
 
    public void Listen()
    {
        Task.Run( () =>
        {
            try
            {
                EndPoint endPoint = new IPEndPoint(IPAddress.Any, 0);
                var flag = SocketFlags.None;
                int bytes_received;
 
                while (true)
                {                    
                    bytes_received = clientSocket.ReceiveMessageFrom(dataBufferSegments, ref flag,
                                        ref endPoint, out IPPacketInformation epRecieve);
 
                    var sb1 = new StringBuilder("{ ");
                    foreach (var b in dataBuffer)
                    {
                        sb1.Append(b.ToString("X2") + ", ");
                    }
                    sb1.Append(" }");
                    Console.WriteLine($"({endPoint.ToString()}) :\n  {sb1.ToString()}");
                }
            }
            catch
            {
                throw new Exception("Ошибка прослушки порта клиентом");
            } 
        }
        );
    }
 
    public void Send(byte[] data)
    {
        try
        {
            EndPoint epSend = new IPEndPoint(IPAddress.Parse(IpSend), Port);
                            
            var s = new ArraySegment<byte>(data);
            clientSocket.SendTo(s, SocketFlags.None, epSend);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
 
    }
}
Код запроса
C#
1
2
3
4
5
6
7
8
9
10
11
12
 ...
 var Client = __Services.GetRequiredService<UDPClient>();
 if (Client != null)
 {
     Client.IpSend = Ip;
     Client.Port = Port;
 
     Client.Initialize();
      byte[] request = Encoding.UTF8.GetBytes("Запрос от клиента");
      Client.Send(request);    
 }
...
В итоге сервер выводит :
Кликните здесь для просмотра всего текста

Ожидаю пакеты данных...
bytes 0
Пакет от аппаратуры (ip:xxxxx) :
{ 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, }
Ожидаю пакеты данных...

С чем связано, что массив пустой?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.09.2024, 18:48
Ответы с готовыми решениями:

Данные не поступают в таблицу
Данные не поступают в таблицу из формы &lt;h2 align=&quot;center&quot;&gt;Оформление заказа&lt;/h2&gt; &lt;? if($_SESSION &amp;&amp;...

Данные счетчика не поступают
Всем привет! Помогите с вопросом. Может кто сталкивался? В общем я установил счетчик My Target на свой сайт на WordPress, обычный лендинг...

В массив не поступают данные
Создал 3 файла. В 1-м просто форма, 2-м произведение 1 и 2 строки массива,в 3 вызываю результат, но появляется ошибка, что в массиве 0, не...

12
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3421 / 2740 / 575
Регистрация: 04.09.2018
Сообщений: 8,608
Записей в блоге: 3
10.09.2024, 20:33
Цитата Сообщение от agapa Посмотреть сообщение
С чем связано, что массив пустой?
ну если сильно не вникая, то, связано с:
а) клиент и сервер попутаны
б) у сервера код... слов нет
в) клиент непонятно чего ждет

Добавлено через 2 минуты
По ходу, у тебя просто два клиента. На сервере должен быть Listener...
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
10.09.2024, 20:44
wizard41, это чистый сокет, причем udp. Серверная часть отличается только биндингом.
1
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3421 / 2740 / 575
Регистрация: 04.09.2018
Сообщений: 8,608
Записей в блоге: 3
10.09.2024, 20:56
Wolfdp, а, UDP же.. Ну да. Проглядел.
0
Эксперт .NET
 Аватар для Usaga
14305 / 9389 / 1355
Регистрация: 21.01.2016
Сообщений: 35,401
11.09.2024, 06:47
agapa, а ты какую задачу решаешь? Может тебе взять какой-то готовый вариант механизма передачи данных, где транспортный протокол уже за тебя реализован? REST, gRPC, или иже с ними?
0
0 / 0 / 0
Регистрация: 01.04.2021
Сообщений: 82
11.09.2024, 07:21  [ТС]
Доброе время суток
Цитата Сообщение от Usaga Посмотреть сообщение
agapa, а ты какую задачу решаешь?
- локальная задача обмена с аппаратурой.
Решили перейти с TCP сокета на UDP. Я быстро нацарапал код и получил такое.
Не понимаю, почему конект проходит, а данные запроса - нет
0
Эксперт .NET
 Аватар для Usaga
14305 / 9389 / 1355
Регистрация: 21.01.2016
Сообщений: 35,401
11.09.2024, 07:43
Лучший ответ Сообщение было отмечено agapa как решение

Решение

Цитата Сообщение от agapa Посмотреть сообщение
- локальная задача обмена с аппаратурой.
А клиент (сервер?) в аппаратуре тоже на C#?
1
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
11.09.2024, 11:08
Лучший ответ Сообщение было отмечено agapa как решение

Решение

Цитата Сообщение от agapa Посмотреть сообщение
Решили перейти с TCP сокета на UDP
Довольно радикальный переход. Вы же в курс про их отличия? Даже локальная сеть не гарантирует что UDP будет доходить.

Цитата Сообщение от agapa Посмотреть сообщение
C#
1
bytes_received = serverSocket.ReceiveMessageFrom(dataBufferSegments, ref flag, ref endPoint, out IPPacketInformation epRecieve);
Как-то очень накрутили. socketFlags судя по всему не только проставляется методом, но и используется, а он у вас None. Попробуйте просто ReceiveFrom(Byte[], EndPoint)
1
0 / 0 / 0
Регистрация: 01.04.2021
Сообщений: 82
11.09.2024, 18:48  [ТС]
Спасибо за советы
Цитата Сообщение от Usaga Посмотреть сообщение
А клиент (сервер?) в аппаратуре тоже на C#?
- Да. Я же его и пишу.
Цитата Сообщение от Wolfdp Посмотреть сообщение
Попробуйте просто ReceiveFrom(Byte[], EndPoint)
- попробую

Нашел пример
C#
1
2
3
4
5
6
7
8
9
10
private void Receive()
        {            
            _socket.BeginReceiveFrom(state.buffer, 0, bufSize, SocketFlags.None, ref epFrom, recv = (ar) =>
            {
                State so = (State)ar.AsyncState;
                int bytes = _socket.EndReceiveFrom(ar, ref epFrom);
                _socket.BeginReceiveFrom(so.buffer, 0, bufSize, SocketFlags.None, ref epFrom, recv, so);
                Console.WriteLine("RECV: {0}: {1}, {2}", epFrom.ToString(), bytes, Encoding.ASCII.GetString(so.buffer, 0, bytes));
            }, state);
        }
Заменил на сервере и клиенте методы Listen на Receive - все заработало
Но осадок , мля!, остался....

Добавлено через 41 минуту
Всем спасибо за советы
Мля.... А все оказывается банально - невнимательность - не пробиндил ArraySegment
C#
1
2
 byte[] buffer = new byte[30];
                ArraySegment<byte> dataBufferSegments = new();
Цитата Сообщение от Wolfdp Посмотреть сообщение
Попробуйте просто ReceiveFrom(Byte[], EndPoint)
- подходит все: ReceiveMessageFrom и ReceiveFrom. А вот ReceiveMessageFromAsync коряво возвращает EndPoint/ Как по мне лучше BeginReceiveFrom
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
11.09.2024, 23:52
Begin это старый подход и откровенно говоря не самый удобный. В идеале нужно таки разобраться с async.
0
Эксперт .NET
 Аватар для Usaga
14305 / 9389 / 1355
Регистрация: 21.01.2016
Сообщений: 35,401
12.09.2024, 04:29
Цитата Сообщение от agapa Посмотреть сообщение
- Да. Я же его и пишу.
Тогда я бы посоветовал использовать готовые протоколы, а не изобретать свой: REST, gRPC.
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
12.09.2024, 08:38
Цитата Сообщение от Usaga Посмотреть сообщение
Тогда я бы посоветовал использовать готовые протоколы, а не изобретать свой: REST, gRPC.
Я бы отталкивался от задачи. Может там просто нужно с прибора слать поток данных, и пофиг на принимающую сторону. Тогда самописное в целом имеет смысл.
0
Эксперт .NET
 Аватар для Usaga
14305 / 9389 / 1355
Регистрация: 21.01.2016
Сообщений: 35,401
12.09.2024, 11:38
Wolfdp, ну, от задачи отталкиваться правильное решение. Но ТС и сервер и клиент сам пишет. Т.е выбор как реализовать остаётся за ним. И явно вопрос не в производительности, раз задачу ТСу назначили. Поэтому не вижу смысла тратить время на низкоуровневое решение, когда можно взять более прикладное, где вопросы передачи данных за ТСа решены.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.09.2024, 11:38
Помогаю со студенческими работами здесь

В ajax не поступают данные
Существует следующая ситуация. Из формы считываю данные, данные считываются (проверила alert), но в ajax все данные приходят пустыми. Не...

Подойдут ли вентиляторы от сокету 1150 к сокету 1151
Хочу собирать компьютер на сокете 1151 , но не вижу вентиляторов к такому процессору , подойдут ли вентиляторы к сокету 1150. И ещё вопрос...

Не поступают данные в поток (posix)
#include &lt;iostream&gt; #include &lt;sstream&gt; #include &lt;pthread.h&gt; #include &lt;vector&gt; using namespace std; struct thread_data { int...

ASP.NET как отправить данные по сокету?
Привет У меня в ASP.NET есть Web Form, я (в цикле) отправляю тексты по (socket-у) с C# клиента на сервер, но клиент группирует эти...

Нужно с PHP по сокету получить данные с сервера
Задача такая. Есть некий 'сервер', (exe) написанный на Delphi. Мне нужно с PHP по сокету получить данные с этого сервера. Все бы ничего....


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это дополнительная запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru