Розетка закрывается автоматически - PullRequest
1 голос
/ 10 ноября 2010

Есть ли причина, по которой Сокет должен закрываться сам по себе через 2 часа?Я получаю данные каждую секунду из этого сокета и каждые 30 с записываю некоторые крошечные данные «keep-alive».

Перед отправкой я проверяю, подключен ли сокет, используя следующий метод:

public bool IsSocketReadyForWriting(Socket s)
{
   try
   {
      if (!s.Connected)
      {
          Log.Info("Socket.Connected was false");
          return false;
      }

      // following line will throw if socket disconnected
      bool poll = s.Poll(2000, SelectMode.SelectWrite);
      if (!poll)
      {
         try
         {
            // if poll is false, socket is closed
            Log.Info("poll is false");
            this.Close();
         }
         catch { }
         return false;
      }
      Log.Debug("still connected");
      return true;
   }
   catch (Exception ex)
   {
      Log.Error("Error while checking if socket connected", ex);
      return false;
   }
}

Все работает нормально около 2 часов, затем внезапно Socket.Poll возвращает false, и Socket закрывается.

Есть ли настройка, которая контролирует это, или я действительно что-то делаю неправильно?

[Редактировать]

Забыл упомянуть: я контролирую и серверную и клиентскую часть ссылки.Это оба приложения на C #, одно из которых создает сокет прослушивания, другое открывает соединение и отправляет данные.Они общаются без проблем в течение 2 часов (без утечек памяти и прочего), затем сокет закрывается.

Когда это происходит, я легко могу снова подключить розетку, но я просто брожу, если кто-нибудь знает, почему это может быть причиной.

Ответы [ 2 ]

3 голосов
/ 10 ноября 2010

По умолчанию TCP-сокет доступен для записи, если в сокете есть хотя бы один байт пространства Отправить буфер . Чтобы изменить это - сокет не доступен для записи, когда в «очереди вывода» содержится достаточно неподтвержденных данных.

Тем не менее, извлеките wireshark или все, что Microsoft предоставляет для прослушивания пакетов, и посмотрите, что происходит в сети. Ваши куски сердцебиения получают ACK -ед? Окно приемника остается открытым или оно обнуляется? Или вы просто получаете RST или FIN от какого-то промежуточного переключателя?

Один из способов уменьшить временное засорение канала - увеличить размер буфера отправки, который по умолчанию является незначительным по умолчанию в Windows - 8192 iirc. См. setsockopt (возможно, версия .NET имеет такую ​​версию) и параметр SO_SNDBUF.

1 голос
/ 10 ноября 2010

Может ли сервер закрывать соединение?Есть ли у вас контроль над этим?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...