Существующее соединение было принудительно закрыто удаленным узлом
Я работаю с коммерческим приложением, которое бросает 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 означает, что пакет нулевых байтов пытается быть отправленным.
что вы думаете? Это может быть неубедительно, я думаю, но, возможно, кто-то еще видел такое?
9 ответов:
это обычно означает, что удаленная сторона закрыла соединение (обычно путем отправки TCP / IP
RSTпакетов). Если вы работаете со сторонним приложением, вероятными причинами являются:
- вы отправляете искаженные данные в приложение
- сетевое соединение между клиентом и сервером происходит по какой-то причине
- вы вызвали ошибку в стороннем приложении, которое вызвало его сбой
- третья сторона приложение исчерпало системные ресурсы
вероятно, что первый случай-это то, что происходит.
вы можете Wireshark чтобы точно увидеть, что происходит на проводе, чтобы сузить проблему.
без более конкретной информации маловероятно, что кто-то здесь действительно может вам помочь.
Это не ошибка в коде. Он исходит из реализации сокета .Net. Если вы используете перегруженную реализацию EndReceive, как показано ниже, вы не получите это исключение.
SocketError errorCode; int nBytesRec = socket.EndReceive(ar, out errorCode); if (errorCode != SocketError.Success) { nBytesRec = 0; }
простое решение для этой общей раздражает вопрос:
идите в ".контекст.cs " файл (расположен под ".context.tt " который находится под вашим "*.файл edmx").
затем добавьте эту строку в конструктор:
public DBEntities() : base("name=DBEntities") { this.Configuration.ProxyCreationEnabled = false; // ADD THIS LINE ! }надеюсь, что это полезно.
была та же ошибка. На самом деле работал в случае, если трафик был отправлен с помощью какого-то прокси (скрипач в моем случае). Обновлена .NET framework с 4.5.2 до >=4.6 и теперь все работает нормально. Фактический запрос был:
new WebClient().DownloadData("URL");
Исключение составляло:SocketException: существующее соединение было принудительно закрыто удаленный хост
С помощью TLS 1.2 решена эта ошибка.
Вы можете заставить свое приложение использовать TLS 1.2 с этим (обязательно выполните его перед вызовом службы):ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12другое решение :
Включите сильную криптографию на вашем локальном компьютере или сервере, чтобы использовать TLS1.2, потому что по умолчанию он отключен, поэтому используется только TLS1.0.
Чтобы включить надежную криптографию, выполните эти команды в PowerShell с правами администратора :Set-ItemProperty -Path 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\.NetFramework\v4.0.30319' -Name 'SchUseStrongCrypto' -Value '1' -Type DWord Set-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\.NetFramework\v4.0.30319' -Name 'SchUseStrongCrypto' -Value '1' -Type DWordвам нужно перезагрузить компьютер, чтобы изменения вступили в силу.
У меня есть это исключение из-за круговой ссылки в entity.In сущность, которая выглядит как
public class Catalog { public int Id { get; set; } public int ParentId { get; set; } public Catalog Parent { get; set; } public ICollection<Catalog> ChildCatalogs { get; set; } }Я добавил [IgnoreDataMemberAttribute] к родительскому свойству. И это решило проблему.
Я получил это исключение, когда я пытался прочитать строку из базы данных, которая имела null в столбце перечисления, он не мог сопоставить null в значение перечисления.
Я встретил это исключение, когда DateTime свойство класса не получает значение .Я просто сделал его nullable DateTime и нашел решение .
public class PlanningBoardBO { ... Other Properties ... public DateTime? PickupDate { get; set; } ... Here changed DateTime to DateTime? }
эта ошибка произошла в моем приложении с CIP-протоколом всякий раз, когда я не отправлял или не получал данные менее чем за 10 секунд.
Это было вызвано использованием прямого открытого метода. Вы можете избежать этого, работая с другим методом, или установить скорость обновления меньше 10s, которые поддерживают ваше прямое открытое соединение.
Comments