Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
19 / 19 / 14
Регистрация: 06.08.2009
Сообщений: 538

Не работает метод ReceiveAsync класса Socket

27.07.2018, 08:41. Показов 4033. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.
Устанавливаю соединение на прослушивание вот таким образом:

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
        /// <summary>
        /// Слушаем входящие соединения
        /// </summary>
        public void listen()
        {
            listener.Bind(ip_end_point);
            listener.Listen(10); //10 - максимальная длина очереди ожидающих подключений
            is_waiting_new_connection = false;
            is_active = true;
 
            //цикл ожидания подключения
            while (is_active)
            {
                //проверим новое соединение
                if (!is_waiting_new_connection)
                {
                    is_waiting_new_connection = true;
                    SocketAsyncEventArgs arg = new SocketAsyncEventArgs();
                    arg.Completed += SocketAsyncEventCompleted;
                    if (!listener.AcceptAsync(arg))
                    {
                        add_new_connection(arg);
                    }
                }
 
                //слушаем соедиенния
                foreach (ClientConnection connection in connections)
                {
                    if (connection.socket == null) continue; //Еще не успели соединиться
                    if (!connection.socket.Connected) continue;
                    SocketAsyncEventArgs arg = new SocketAsyncEventArgs();
                    arg.Completed += connection.SocketAsyncReceiveEventCompleted;
                    if(!connection.socket.ReceiveAsync(arg))
                    {
                        connection.receive(arg);
                    }
                }
 
                Thread.Sleep(10);
            }
 
            //перед выходом закреом все соединения
            foreach(ClientConnection connection in connections)
            {
                connection.socket.Close();
            }
        }
Соответственно, при приходе нового соединения добавляю его в список:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        /// <summary>
        /// Добавить сведения о новом подключении
        /// </summary>
        /// <param name="arg">Структура</param>
        private void add_new_connection(SocketAsyncEventArgs arg)
        {
            ClientConnection connection = new ClientConnection();
            connection.socket = arg.AcceptSocket;
            connection.connection_time = DateTime.Now;
            connection.id = current_id;
            connection.OnReceiveMessage += OnReceiveMessage;
            current_id++;
            connections.Add(connection);
            is_waiting_new_connection = false; //дождались
            OnStockNewConnection?.Invoke(connection);
        }
Но почему-то как только какой-нибудь клиент устанавливает соединение с сервером, сервер на строке
C#
1
2
3
4
                    if(!connection.socket.ReceiveAsync(arg))
                    {
                        connection.receive(arg);
                    }
Валится с исключением
Необработанное исключение типа "System.NullReferenceException" в System.dll
Дополнительные сведения: Ссылка на объект не указывает на экземпляр объекта.
Подскажите, пожалуйста, что делаю не так?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.07.2018, 08:41
Ответы с готовыми решениями:

Как получить Thread поток Socket.ReceiveAsync?
Имеется операция ReceiveAsync. Если не приходят никакие данные, то завершить вручную никак. вот подумал как-то получить поток в котором...

Как работает метод Socket.BeginAccept
Пожалуйста объясните &quot;на пальцах&quot; как работают некоторые функции в этом коде. Вопросы указаны в комментариях. Описанный ниже код...

Не работает метод класса
Всем привет. Есть класс World_Class, в нем метод Create_World(). В методе я пытаюсь получить доступ к picture_box формы, но не получается....

4
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
27.07.2018, 09:09
Цитата Сообщение от megabax Посмотреть сообщение
Подскажите, пожалуйста, что делаю не так?
Видимо connection.socket == null. Почему? Разбирайтесь в отладчике...
0
19 / 19 / 14
Регистрация: 06.08.2009
Сообщений: 538
27.07.2018, 09:16  [ТС]
Someone007,
Я же поставил поверку
C#
1
if (connection.socket == null) continue; //Еще не успели соединиться
то есть, если connection.socket == null то до этой строки вообще не должно доходить. Да и отладчик показывает, что connection.socket реальное значение, а не null
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
27.07.2018, 09:35
Цитата Сообщение от megabax Посмотреть сообщение
если connection.socket == null то до этой строки вообще не должно доходить.
Может у вас arg==null...
0
19 / 19 / 14
Регистрация: 06.08.2009
Сообщений: 538
27.07.2018, 10:10  [ТС]
Цитата Сообщение от insite2012 Посмотреть сообщение
Может у вас arg==null...
Тоже не null. Во-первых, он строчкой выше явно создается, во-вторых, отладчик показывает, что не null.

Добавлено через 28 минут
Все, всем спасибо, разобрался сам. Надо было просто установить буфер для приема сообщений:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
                //слушаем соедиенния
                foreach (ClientConnection connection in connections)
                {
                    if (connection.socket == null) continue; //Еще не успели соединиться
                    if (!connection.socket.Connected) continue;
                    SocketAsyncEventArgs arg = new SocketAsyncEventArgs();
                    byte[] buffer = new byte[1024];
                    arg.SetBuffer(buffer, 0, buffer.Length); //Вот!!!!!!!!!!!!!!!!!!!!!
                    arg.Completed += connection.SocketAsyncReceiveEventCompleted;
                    if(!connection.socket.ReceiveAsync(arg))
                    {
                        connection.receive(arg);
                    }
                }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.07.2018, 10:10
Помогаю со студенческими работами здесь

Не работает метод класса
Добрый вечер. При решении задачи столкнулся с проблемой. Есть вектор контейнер, заполнен class-объектами. Нада вызвать метод con_salary(),...

Не работает метод класса
#define _CRT_SECURE_NO_WARNINGS #include &lt;iostream&gt; using namespace std; class Lines { private: char *line;

Не работает метод класса
class Lines { private: char *line; public: void setLine(char *l) { int len = strlen(l);

Не работает метод класса
У меня есть свой класс Team, который имеет метод addteam : public class Team : Form1 { *часть кода* ...

Не работает дружественный метод класса
Почему такой код не работает? Работает только в случае, если весь класс сделать дружественным. В чём ошибка? // Класс вектор class...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
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
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru