2013-05-27 3 views
0

Я использую TcpClient. Иногда получайте ошибку:NetStream TcpClinet Не удается прочитать данные из транспортного соединения

Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host. at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)

Я попытался разрешить информацию из вкладок stackoverflow. Я добавляю условие

netStream.CanRead

но без успеха. Что я делаю неправильно? Вот часть кода, спасибо.

try 
     { 
      if (netStream.CanRead) 
      { 
       do 
       { 
        int bytesRead = netStream.Read(bytes, 0, bytes.Length); 
        bytesReaded += bytesRead; 
        if (bytesRead > 0) 
        { 
         byte[] toList = new byte[bytesRead]; 
         Array.Copy(bytes, toList, bytesRead); 
         listBytes.AddRange(toList); 
        } 
       } 
       while (netStream.DataAvailable); 

       if (listBytes.Count > 0) 
        ParseAllBytes(); 
      } 
      else 
      {      
       Close(); 
      } 
     } 
     catch (IOException ex) 
     { 

ответ

0

Проблема в брандмауэре Windows, если я отключу брандмауэр, работающий отлично. Если брандмауэр включен, и я добавил правило к inbouds и outbounds, я получаю это исключение, см. Сверху.

0

Из моего опыта это исключение бросается только тогда, когда вы подключаетесь к закрытию соединения. Если это через Интернет, существует много перелетов по пути, который может быть причиной отказа подключения. Если вы уверены, что этого не должно быть (возможно, обе стороны находятся в вашей инфраструктуре), я бы рекомендовал запустить трассировку wirehark. Там вы легко сможете увидеть закрытие соединения, если оно закрывается и кто его закрывает. Ищите пакеты tcp с флагом флага, установленным в 1.

+0

Это будет трудно использовать wirehark, поэтому эта ошибка не является периодической. С этой проблемой после отсоединения клиент не может подключиться к TcpClient. Я должен перезапустить службу. У этой проблемы есть связь с ошибкой? – Musketyr

+0

Возможно, вам понадобится воссоздать ваш сокет или TcpClient, если у вас неправильно установлено гнездо повторного использования. Мне никогда не приходилось работать. Я всегда создаю новый сокет. Я не уверен, имеет ли TcpClient ту же идею повторного использования, что и сокет. – uriDium

+0

Обработка входящих данных для каждого клиента в новой теме в новом экземпляре TcpClient. После ошибки TcpClient и NetStream расположены правильно. – Musketyr

 Смежные вопросы

  • Нет связанных вопросов^_^