Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.02.2019, 01:13   #1
Max_t
 
Регистрация: 18.02.2019
Сообщений: 7
По умолчанию После обрыва связи и повторного соединения сокет не отвечает на сообщения

Клиент на C# подключается к сокету на некотором аппарате на определенный IP-адрес и порт. Узнать или поменять код на аппарате возможности нет. С целью тестирования вынимаю сетевой кабель из роутера и пытаюсь закрыть сокет с помощью кода:
Код:
mySocket.Shutdown(SocketShutdown.Both);
mySocket.Disconnect(false);
mySocket.Close();
mySocket.Dispose();
Затем снова соединяюсь:
Код:
mySocket.Connect(ipEndPoint);
После того, как попытаться подключиться к сокету, не закрытому из-за обрыва связи, и попытаться на него отправить данные, отправка данных проходит без ошибок, но сокет не отвечает на запросы с любого компьютера из любого приложения. Если перезагрузить аппарат, связь начинает работать нормально. Перезагрузить аппарат программно возможности нет.
Если не закрывать сокет и не подсоединяться к нему снова при обрыве связи, после того, как подсоединить сетевой кабель, связь снова начинает работать нормально.
Если перезагрузить аппарат при работающем приложении клиента, при попытке отправить данные на сокет появляется исключение:
Программа на вашем хост-компьютере разорвала установленное подключение
После этого сокет не отвечает на запросы. Если затем закрыть сокет, а потом к нему снова подсоединиться, связь начинает работать нормально. То есть в этом случае наоборот надо перезапускать соединение.
Сейчас отслеживаю это исключение, при его возникновении перезапускаю соединение, при остальных ошибках не перезапускаю.
Если отслеживать только указанное исключение и перезапускать связь только при его возникновении, затем восстанавливается связь при обрыве соединения как со стороны клиента, так и со стороны аппарата. Но, если попытаться отправить данные и после этого выйти из приложения при отсутствии связи, когда вынут сетевой кабель, и запустить приложение снова, сокет не отвечает на запросы. Если после этого перезагрузить компьютер, происходит то же самое.
Есть ли способы заставить сокет, не закрытый корректно из-за отсутствия связи, отвечать на запросы? Что еще можно изменить в указанном способе отслеживания ошибок соединения? Необходимо, чтобы связь автоматически восстанавливалась после любой ошибки, включая обрыв связи по сети.
Max_t вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как заново выполнить отладку после повторного запуска? nikytt Visual C++ 4 30.08.2015 17:29
Сохранение измененных данных в datagridview после повторного запуска mdiChild-окна программы с этим же dgv zzyika Базы данных (ADO.NET, LinqToSql, ORM Entity Framework, NHibernate) 1 27.02.2015 04:49
Полное заполнение таблицы в общем доступе/, но без права повторного редактирования ячеек после сохранения Print Microsoft Office Excel 3 01.10.2011 13:20
Почему на мои сообщения никто не отвечает? Lyubimov Свободное общение 16 16.04.2011 22:51
Ошибка повторного соединения. Nemez Microsoft Office Word 5 24.09.2008 07:31