На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
Модераторы: maxim84_, juice
  
> После обрыва связи и повторного соединения сокет не отвечает на сообщения
    Клиент на C# подключается к сокету на некотором аппарате на определенный IP-адрес и порт. Узнать или поменять код на аппарате возможности нет. С целью тестирования вынимаю сетевой кабель из роутера и пытаюсь закрыть сокет с помощью кода:
    ExpandedWrap disabled
      mySocket.Shutdown(SocketShutdown.Both);
      mySocket.Disconnect(false);
      mySocket.Close();
      mySocket.Dispose();

    Затем снова соединяюсь:
    ExpandedWrap disabled
      mySocket.Connect(ipEndPoint);

    После того, как попытаться подключиться к сокету, не закрытому из-за обрыва связи, и попытаться на него отправить данные, отправка данных проходит без ошибок, но сокет не отвечает на запросы с любого компьютера из любого приложения. Если перезагрузить аппарат, связь начинает работать нормально. Перезагрузить аппарат программно возможности нет.
    Если не закрывать сокет и не подсоединяться к нему снова при обрыве связи, после того, как подсоединить сетевой кабель, связь снова начинает работать нормально.
    Если перезагрузить аппарат при работающем приложении клиента, при попытке отправить данные на сокет появляется исключение:
    Программа на вашем хост-компьютере разорвала установленное подключение
    После этого сокет не отвечает на запросы. Если затем закрыть сокет, а потом к нему снова подсоединиться, связь начинает работать нормально. То есть в этом случае наоборот надо перезапускать соединение.
    Сейчас отслеживаю это исключение, при его возникновении перезапускаю соединение, при остальных ошибках не перезапускаю.
    Если отслеживать только указанное исключение и перезапускать связь только при его возникновении, затем восстанавливается связь при обрыве соединения как со стороны клиента, так и со стороны аппарата. Но, если попытаться отправить данные и после этого выйти из приложения при отсутствии связи, когда вынут сетевой кабель, и запустить приложение снова, сокет не отвечает на запросы. Если после этого перезагрузить компьютер, происходит то же самое.
    Есть ли способы заставить сокет, не закрытый корректно из-за отсутствия связи, отвечать на запросы? Что еще можно изменить в указанном способе отслеживания ошибок соединения? Необходимо, чтобы связь автоматически восстанавливалась после любой ошибки, включая обрыв связи по сети.
    1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
    0 пользователей:


    Рейтинг@Mail.ru
    [ Script Execution time: 0,0576 ]   [ 15 queries used ]   [ Generated: 21.03.19, 06:12 GMT ]