Я работаю с коммерческим приложением, которое выдает SocketException с сообщением,
Существующее соединение было принудительно закрыто удаленным хостом
Это происходит с сокетным соединением между клиентом и сервером. Связь жива и здорова, и передается куча данных, но затем она отключается из ниоткуда.
Кто-нибудь видел это раньше? Какие могут быть причины? Я могу предположить несколько причин, но также есть ли способ добавить больше в этот код, чтобы понять, что может быть причиной?
Любые комментарии / идеи приветствуются.
... Последний ...
У меня есть некоторые записи из некоторых трассировки .NET,
System.Net.Sockets Verbose: 0 : [8188] Socket#30180123::Send() DateTime=2010-04-07T20:49:48.6317500Z
System.Net.Sockets Error: 0 : [8188] Exception in the Socket#30180123::Send - An existing connection was forcibly closed by the remote host DateTime=2010-04-07T20:49:48.6317500Z
System.Net.Sockets Verbose: 0 : [8188] Exiting Socket#30180123::Send() -> 0#0
Основываясь на других частях ведения журнала, я видел тот факт, что он говорит, что «0 # 0» означает, что отправляется пакет длиной 0 байт. Но что это на самом деле означает?
Происходит одна из двух возможностей, и я не уверен, какая,
1) Соединение закрывается, но затем данные записываются в сокет, что создает исключение выше. 0 # 0 просто означает, что ничего не было отправлено, потому что сокет уже был закрыт.
2) Соединение все еще открыто, и отправляется пакет с нулевыми байтами (то есть код содержит ошибку), а 0 # 0 означает, что пакет с нулевыми байтами пытается быть отправлен.
Как вы думаете? Это может быть неубедительным, я думаю, но, возможно, кто-то еще видел такие вещи?
источник
Ответы:
Как правило, это означает, что удаленная сторона закрыла соединение (обычно путем отправки
RST
пакета TCP / IP ). Если вы работаете со сторонним приложением, вероятные причины:Вполне вероятно, что в первом случае происходит то, что происходит.
Вы можете запустить Wireshark, чтобы точно увидеть, что происходит на проводе, чтобы сузить проблему.
Без более конкретной информации маловероятно, что кто-то здесь действительно может вам сильно помочь.
источник
https
запроса наhttp
сервер и, возможно, наоборот.Использование TLS 1.2 решило эту ошибку.
Вы можете принудительно заставить ваше приложение использовать TLS 1.2 с помощью этого (обязательно запустите его перед вызовом службы):
Другое решение:
включите сильную криптографию на вашем локальном компьютере или сервере, чтобы использовать TLS1.2, потому что по умолчанию он отключен, поэтому используется только TLS1.0.
Чтобы включить сильную криптографию, выполните следующие команды в PowerShell с правами администратора:
Вам необходимо перезагрузить компьютер, чтобы эти изменения вступили в силу.
источник
Это не ошибка в вашем коде. Это происходит от реализации Socket .Net. Если вы используете перегруженную реализацию EndReceive, как показано ниже, вы не получите это исключение.
источник
EndReceive
выбрасывает исключение при изящном завершении клиента. Не знал, что это по замыслу. Я чувствую его плохой дизайн, чтобы генерировать исключения в обычных потоках кода. Слава Богу за перегруженный метод.StateObject
класс сpublic byte[] buffer = new byte[1024], public Socket socket;
и вызывать вызываемую функциюReceive(Socket s)
, которая делаетStateObject so = new StateObject(); so.socket = s; s.BeginReceive(so.buffer, 0, 256, 0, new AsyncCallback(ReceiveCallback), so);
иvoid ReceiveCallback(IAsyncResult ar)
вы вызываете этот код выше.Send
прежде чем вы сможете сделать что-то еще.Простое решение для этой распространенной проблемы:
Просто перейдите в файл « .context.cs» (расположенный в « .context.tt», который находится в вашем файле «* .edmx»).
Затем добавьте эту строку в ваш конструктор:
надеюсь, что это полезно.
источник
socket.Send(x); byte[] buffer = new byte[1]; socket.Receive(buffer, 0, 1, 0);
чтение возвращенных байтов, что было проблемой OP.ENTITY FRAMEWORK
только это решение работает !!! только это ! спасибо братан :)Была такая же ошибка. На самом деле работал в случае, если трафик был отправлен с использованием какого-либо прокси (Fiddler в моем случае). Обновлен .NET Framework с 4.5.2 до> = 4.6, и теперь все работает нормально. Фактический запрос был:
new WebClient().DownloadData("URL");
Исключение было:
источник
Я получил это исключение из-за циклической ссылки в entity.In лица, которые выглядят как
Я добавил [IgnoreDataMemberAttribute] в свойство Parent. И это решило проблему.
источник
Если работает в службе .Net 4.5.2
Для меня проблема была усугублена, потому что вызов выполнялся в службе .Net 4.5.2. Я последовал предложению @willmaz, но получил новую ошибку.
При запуске службы с включенным ведением журнала я видел, что рукопожатие с целевым сайтом инициируется нормально (и отправляется токен на предъявителя), но на следующем шаге для обработки вызова Post, кажется, будет сброшен токен аутентификации, и сайт будет ответить с
Unauthorized
.Оказалось, что учетные данные пула сервисов не имеют прав на изменение TLS (?), И когда я вставил свою локальную учетную запись администратора в пул, все заработало.
источник
Для тех, кто получает это исключение при чтении данных из потока, это может помочь. Я получал это исключение при чтении HttpResponseMessage в цикле, как это:
Через некоторое время я узнал, что виновником был размер буфера, который был слишком мал и плохо подходил для моего слабого экземпляра Azure. Что помогло, так это изменить код на:
Метод CopyTo () имеет размер буфера по умолчанию, равный 81920. Больший буфер ускорил процесс, и ошибки немедленно прекратились, скорее всего, из-за увеличения общей скорости загрузки. Но почему скорость загрузки имеет значение для предотвращения этой ошибки?
Возможно, вы отсоединились от сервера, поскольку скорость загрузки падает ниже минимального порога, разрешенного сервером. Например, если приложение, с которого вы загружаете файл, размещено на IIS, это может быть проблемой с конфигурацией http.sys:
«Http.sys - это стек протокола http, который IIS использует для выполнения http-связи с клиентами. Он имеет таймер MinBytesPerSecond, который отвечает за уничтожение соединения, если его скорость передачи падает ниже порога в несколько килобайт / с. По умолчанию этот порог равен установить 240 кбит / с. "
Эта проблема описана в этом старом блоге от команды разработчиков TFS и касается конкретно IIS, но может указать вам верное направление. Также упоминается старая ошибка, связанная с этим атрибутом http.sys: ссылка
Если вы используете службы приложений Azure и увеличение размера буфера не устраняет проблему, попробуйте также увеличить масштаб вашей машины. Вам будет выделено больше ресурсов, включая пропускную способность соединения.
источник
У меня была та же проблема, и мне удалось ее решить в конце концов. В моем случае порт, на который клиент отправляет запрос, не имеет привязки SSL-сертификата. Поэтому я исправил проблему, привязав сертификат SSL к порту на стороне сервера. Как только это было сделано, это исключение исчезло.
источник
Эта ошибка возникала в моем приложении с CIP-протоколом, когда я не отправлял и не получал данные менее чем за 10 секунд.
Это было вызвано использованием метода прямого открытия. Вы можете избежать этого, работая с другим методом, или установить частоту обновления менее 10 с, поддерживающую ваше прямое открытое соединение.
источник