<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414289&amp;view=findpost&amp;p=3790459</guid>
        <pubDate>Mon, 18 Feb 2019 22:17:39 +0000</pubDate>
        <title>После обрыва связи и повторного соединения сокет не отвечает на сообщения</title>
        <link>https://forum.sources.ru/index.php?showtopic=414289&amp;view=findpost&amp;p=3790459</link>
        <description><![CDATA[Макс1: Клиент на C# подключается к сокету на некотором аппарате на определенный IP-адрес и порт. Узнать или поменять код на аппарате возможности нет. С целью тестирования вынимаю сетевой кабель из роутера и пытаюсь закрыть сокет с помощью кода:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">mySocket.Shutdown(SocketShutdown.Both);</div><div class="code_line">mySocket.Disconnect(false);</div><div class="code_line">mySocket.Close();</div><div class="code_line">mySocket.Dispose();</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
Затем снова соединяюсь:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">mySocket.Connect(ipEndPoint);</div></ol></div></div></div></div><br>
После того, как попытаться подключиться к сокету, не закрытому из-за обрыва связи, и попытаться на него отправить данные, отправка данных проходит без ошибок, но сокет не отвечает на запросы с любого компьютера из любого приложения. Если перезагрузить аппарат, связь начинает работать нормально. Перезагрузить аппарат программно возможности нет.<br>
Если не закрывать сокет и не подсоединяться к нему снова при обрыве связи, после того, как подсоединить сетевой кабель, связь снова начинает работать нормально.<br>
Если перезагрузить аппарат при работающем приложении клиента, при попытке отправить данные на сокет появляется исключение:<br>
Программа на вашем хост-компьютере разорвала установленное подключение<br>
После этого сокет не отвечает на запросы. Если затем закрыть сокет, а потом к нему снова подсоединиться, связь начинает работать нормально. То есть в этом случае наоборот надо перезапускать соединение.<br>
Сейчас отслеживаю это исключение, при его возникновении перезапускаю соединение, при остальных ошибках не перезапускаю.<br>
Если отслеживать только указанное исключение и перезапускать связь только при его возникновении, затем восстанавливается связь при обрыве соединения как со стороны клиента, так и со стороны аппарата. Но, если попытаться отправить данные и после этого выйти из приложения при отсутствии связи, когда вынут сетевой кабель, и запустить приложение снова, сокет не отвечает на запросы. Если после этого перезагрузить компьютер, происходит то же самое.<br>
Есть ли способы заставить сокет, не закрытый корректно из-за отсутствия связи, отвечать на запросы? Что еще можно изменить в указанном способе отслеживания ошибок соединения? Необходимо, чтобы связь автоматически восстанавливалась после любой ошибки, включая обрыв связи по сети.]]></description>
        <author>Макс1</author>
        <category>.NET: Общие вопросы</category>
      </item>
	
      </channel>
      </rss>
	