Существующее соединение было принудительно закрыто удаленным узлом



Я работаю с коммерческим приложением, которое бросает 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 означает, что пакет нулевых байтов пытается быть отправленным.



что вы думаете? Это может быть неубедительно, я думаю, но, возможно, кто-то еще видел такое?

693   9  

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

    Ничего не найдено.