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

UDP отправка на закрытый сокет (ERROR)

16.10.2015, 22:23. Показов 5482. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Уже неделю не могу решить эту проблему!
Я клиентов на сервере обрабатываю асинхронно в ReceiveCallback(IAsyncResult ar), когда от клиента приходит сообщение, то проверяю если его нету в Dictionary, то добавляю туда его Socket и EndPoint, после через foreach рассылаю сообщение всем клиентам которые находятся в Dictionary

Проблема в том, что если один из клиентов закроет приложение, то его порт становится недоступным и когда сервер пытается отправить пакеты на соккет того не доступного клиента, то выходит ошибка =(

И самое интересное ошибка выходит не вот тут:

C#
1
2
3
4
foreach (var clientData in DataList)
                {
                    clientData.Value.Socket.SendTo(data1, clientData.Value.EndPoint);
                }
Тогда бы я просто катчем проверял, а она появляется в ReceiveCallback вот на этой строке:

C#
1
socket.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref epSender, new AsyncCallback(ReceiveCallback), epSender);
Ошибка: An unhandled exception of type 'System.Net.Sockets.SocketException' occurred in System.dll
Additional information: Удаленный хост принудительно разорвал существующее подключение

(видимо нужно каждый раз при отправке каким то образом проверять доступен ли соккет у клиента)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.10.2015, 22:23
Ответы с готовыми решениями:

Как только происходит попытка создать сокет для UDP - сокет TCP сразу ломается (выдает 10093).
Добрый день. Пытаюсь сделать соединение, использующее два канала обмена данными - TCP для управления в режиме клмиента, и UDP - для...

UDP закрытый порт
Здравствуйте, пишу небольшую сетевую игру. В качестве сетевой библиотеки решил использовать SFML network, по 2 причинам. Простота и...

UDP сокет. Ошибка в программе.
Здравствуйте. Здесь я приведу фрагмент своей программы, в который закралась ошибка. В нём описано, как сервер, используя протокол UDP,...

19
2 / 2 / 2
Регистрация: 18.07.2013
Сообщений: 124
20.10.2015, 09:47  [ТС]
UP!!!
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
20.10.2015, 11:35
KinDer015, Вы уверены, что передаете по UDP?
Вот эта ошибка "Удаленный хост принудительно разорвал существующее подключение" может быть только в TCP. В UDP нет никакого подключения.
0
2 / 2 / 2
Регистрация: 18.07.2013
Сообщений: 124
21.10.2015, 17:07  [ТС]
Я понимаю, что в udp о соединениях не может быть и речи, я точно передаю по udp, вот -

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
private static IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Any, portReceive);
        private EndPoint endPoint = (EndPoint)ipEndPoint;
 
 
 
        public void Start()
        {
 
            socket = new Socket(AddressFamily.InterNetwork,
                    SocketType.Dgram, ProtocolType.Udp);
 
          
            IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Any, 28015);
 
            
            socket.Bind(ipEndPoint);
 
            IPEndPoint ipeSender = new IPEndPoint(IPAddress.Any, 0);
          
            EndPoint epSender = (EndPoint)ipeSender;
 
            socket.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref epSender, new AsyncCallback(ReceiveCallback), socket);
 
           
        }
Ради интереса нашел пару примеров чата на udp, и при отключении программы одного из клиентов выдает ту же самую ошибку, так как сервер не может отправить сообщение на закрытый соккет

Добавлено через 23 часа 12 минут
Up!!!
0
2 / 2 / 2
Регистрация: 18.07.2013
Сообщений: 124
24.10.2015, 07:50  [ТС]
Up!!!
0
2 / 2 / 2
Регистрация: 18.07.2013
Сообщений: 124
27.10.2015, 13:25  [ТС]
Up =(
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
27.10.2015, 13:53
KinDer015, ну оберните в try catch, это сетевая ошибка, иначе её и не обработать нормально.
0
2 / 2 / 2
Регистрация: 18.07.2013
Сообщений: 124
27.10.2015, 16:15  [ТС]
Try и catch не помогает так как ошибка возникает не в момент отправки данных, а вот тут -
C#
1
socket.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref epSender, new AsyncCallback(ReceiveCallback), socket);
Если бы ошибка возникала в момент отправки данных тогда бы я смог точно определить какой клиент отключился от сети, и удалил бы его из dictionary

try и catch вот тут не срабатывают -
C#
1
2
3
4
foreach (var clientData in DataList)
                {
                    clientData.Value.Socket.SendTo(data1, clientData.Value.EndPoint);
                }
0
2 / 2 / 2
Регистрация: 18.07.2013
Сообщений: 124
30.10.2015, 16:49  [ТС]
Up!!!
0
30.10.2015, 17:28

Не по теме:

KinDer015, бросайте это дело, пока не посадили:D

Институт развития интернета (ИРИ) России подготовил проект дорожной карты «Медиа и информация», которая является приложением к Программе долгосрочного развития интернета до 2025 года. Документ содержит предложения по развитию медиа и коммуникационной отрасли. Как ожидается, до 1 ноября 2015 года эти предложения будут представлены Президенту России Владимиру Путину.

В частности, в дорожной карте говорится о предложениях по борьбе с пиратством в интернете, которые должны быть реализованы до конца 2016 года. В корпоративных сетях должен быть установлен запрет на пиратский трафик. А за использование юридическими лицами трафика по протоколу UDP предполагается ввести судебную ответственность.

0
03.11.2015, 12:17  [ТС]

Не по теме:

Хах, если бы я делал торрент трекер, тогда бы стоило опасаться :D

Up!

0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
03.11.2015, 12:39
KinDer015, Выложите полностью рабочий проект, который можно запустить и потестить. Ваши отрывки кода ни о чем не говорят. Каждый кусок может быть правильным, а в целом - нет. К тому же UDP такая хитрая штука, возможны очень разные всякие неожиданности.
0
2 / 2 / 2
Регистрация: 18.07.2013
Сообщений: 124
24.12.2015, 19:14  [ТС]
Уже 3 месяца не могу решить проблему с отправкой на не существующий соккет, уже клиент игры готов на 50%, а вот с сервером беда, если к примеру у одного из игроков крашится клиент, то на сервер ни какого сообщения не приходит, о том, что клиент от него отключился, соответственно на сервере в dictionary остается запись с соккетом этого клиента. Сервер отправляет пакеты всем игрокам и он крашится когда доходит до того не существующего соккета.

Может быть какую то проверку пилить при отправке, существует ли данный соккет.

Вот ошибка:

An unhandled exception of type 'System.Net.Sockets.SocketException' occurred in System.dll
Additional information: Удаленный хост принудительно разорвал существующее подключение
Код покажу пишите в личку свой скайп!
0
 Аватар для Chernobyl_
46 / 14 / 15
Регистрация: 25.12.2015
Сообщений: 49
25.12.2015, 08:25
Похоже, самый простой вариант решения проблемы - создать класс для хранения состояния клиента (если такого ещё нет),поместить в него как минимум два поля: сокет клиента и время последней успешной отправки/получения данных. В отдельном потоке (можно использовать таймер) проверять разницу между текущем временем и временем последнего получения/отправки данных). Например - если на протяжении одной минуты небыло получено/отправлено никаких данных, считать клиент отключеным.
0
2 / 2 / 2
Регистрация: 18.07.2013
Сообщений: 124
25.12.2015, 11:08  [ТС]
Спасибо, но способ не совсем подходящий, сервер принимает от клиента 30 сообщений и отправляет 15 в секунду.

Я уже пробовал try и cath поставить на цикл отправки, там ни каких ошибок не возникает -

C#
1
2
3
4
5
if (DataList.Count > 1)
                    foreach (var clientData in DataList)
                    {                       
                        clientData.Value.Socket.SendTo(data1, clientData.Value.EndPoint);                   
                    }
Программа вылетает вот на этой строке:

C#
1
socket.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref epSender, new AsyncCallback(ReceiveCallback), socket);
север у меня асинхронный
0
 Аватар для Chernobyl_
46 / 14 / 15
Регистрация: 25.12.2015
Сообщений: 49
25.12.2015, 11:53
Значит исключение выбивает BeginReceiveFrom ? Какое именно ? Если это так, то можно поместить его в блок try / catch и просто отлавливать.
Чтобы ловить все исключения в Visual Studio нажать Ctrl + Alt + E и отметить "Common Language Runtime Exceptions", после чего запустить программу.
0
2 / 2 / 2
Регистрация: 18.07.2013
Сообщений: 124
25.12.2015, 13:16  [ТС]
да именно в нем - An unhandled exception of type 'System.Net.Sockets.SocketException' occurred in System.dll
Additional information: Удаленный хост принудительно разорвал существующее подключение

Но смысл там ловить? когда уже цикл прошел, цикл перебирает всех клиентов и нужно именно там ловить через try и cath, но там не каких ошибок нету
0
 Аватар для Chernobyl_
46 / 14 / 15
Регистрация: 25.12.2015
Сообщений: 49
26.12.2015, 00:56
Как по мне, всётаки стоит ловить именно исключение. В класс где хранится состояние добавить переменную сигнализирующую о ошибке.

Ещё вариант - проверить подключен ли сокет уже когда перебираешь всех клиентов.
Для определения того подключен ли сокет:

C#
1
2
3
4
5
 
static bool IsSocketConnected(Socket s)
    {
        return !((s.Poll(1000, SelectMode.SelectRead) && (s.Available == 0)) || !s.Connected);
    }
0
2 / 2 / 2
Регистрация: 18.07.2013
Сообщений: 124
31.12.2015, 18:44  [ТС]
Не работает, у меня udp соккеты, соединений нету
0
0 / 0 / 0
Регистрация: 21.12.2015
Сообщений: 2
03.01.2016, 20:06
Помнится мне, что метод EndReceiveFrom возвращает количество переданных данных, и если оно равно 0, то пользователя можно удалять.
И возникает вопрос: Зачем использовать протокол, которые не гарантирует доставку данных, асинхронным образом? Помнится мне, что он предназначен для вещания в виде радиоволны))
По ссылке есть пример асинхронного tcp сервера для игры, можно посмотреть, как контролируется отключение пользователей https://bitbucket.org/JohnnyNu... l_game/src
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.01.2016, 20:06
Помогаю со студенческими работами здесь

Производительность Try-Catch в Сокет UDP
Приветствую, есть такая конструкция. IPEndPoint Address = new IPEndPoint(IPAddress.Parse(Ip), (int)Port); Socket = new...

Один сокет для TCP и UDP
Привет. Клиент-серверное приложение в один промежуток времени использует TCP, но через некоторое время нужно начать передавать и принимать...

Отправить сериализованный объект через сокет по UDP
Доброй ночи, уважаемые форумчане! Нужна консультация по отправке сериализованного объекта по UDP-протоколу (размер файла невелик, файл...

Как через UDP сокет соединить трёх клиентов без сервера?
Люди подскажите как через UDP сокет соединить трёх клиентов без сервера

Отправка данных в сокет
Здравствуйте, уважаемые программисты. Недавно начала изучать c#, столкнулся с проблемой. Пытаюсь написать http-сервер, используя...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru