Добро пожаловать

Я ищу несколько советов (идеальное решение :)) для проблемы, с которой мы сталкиваемся уже давно.

В основном: у нас есть клиентское приложение на Windows Server 2012 и серверное приложение на Windows 7.

Сценарий выглядит так:

  1. Клиент подключается к серверу через TCP
  2. Сервер принимает соединение и отправляет приветственное сообщение
  3. Клиент отправляет сообщение с некоторыми данными
  4. Сервер отправляет ответ (подтверждение того, что он получил сообщение)
  5. Клиент закрывает соединение

Обратите внимание:

  1. Клиент открывает соединение для каждого нового сообщения. Я проверил журналы Wireshark, а также журналы клиент / сервер, и каждое соединение закрыто должным образом.
  2. Даже если мое приложение не обрабатывает соединение правильно, разве Windows не должна всегда отвечать на запросы соединения с ACK / RST?

Проблема: через некоторое случайное время (это может быть 30 минут или даже неделю или две) серверное приложение перестает отправлять ответы. Дальнейшие исследования (Wireshark logs) показывают, что в какой-то момент времени:

  1. Серверное приложение не отвечает сообщением "подтверждение" (№ 4 в "сценарии").
  2. Серверное приложение не отвечает на FIN от клиента (возможно, потому что серверное приложение не закрывает соединение активно)
  3. Клиент отправляет RST через 2 минуты (время ожидания FIN)
  4. Сервер перестает отвечать на любые запросы TCP на этот порт (без ACK /RST, ничего ...)

Смотрите скриншот ниже:https://i.stack.imgur.com/kWC1x.png

1 ответ1

0

Не ясно, где проблема на самом деле. Это сеть? Это серверное приложение? Это серверный компьютер / оборудование / брандмауэр и т.д.? Это клиентский компьютер?

Некоторое устранение неполадок должно иметь место, чтобы знать, где даже искать.

Вот что я бы сделал. Когда приложение работает правильно, на сервере откройте административную командную строку (щелкните правой кнопкой мыши, запустите от имени администратора). Используйте команду netstat -abn | more и просмотрите содержимое. Вам будет предоставлен список активных и прослушиваемых сетевых подключений, отсортированный по протоколу и номеру порта. Вы должны быть в состоянии идентифицировать серверное приложение, прослушивающее данный порт, и оно должно показывать имя исполняемого файла. Если какие-либо активные соединения установлены, вы также увидите эти "установленные" соединения в списке. Теперь вы знаете, как это выглядит, когда работает правильно.

Теперь я бы добавил клиента Telnet для простого тестирования. Клиент Telnet - это функция Windows, которую вы можете добавить. Он отлично подходит для тестирования простых TCP-соединений. Когда все работает, откройте командную строку на сервере и используйте команду telnet localhost <port> - замените номер порта, который слушает ваше приложение. Вы должны получить хотя бы пустой экран, указывающий, что соединение было успешным. Если это не удастся, через некоторое время вы получите тайм-аут. Очевидно, что он не должен превышать тайм-аут, или у вас определенно есть что-то, блокирующее соединения (даже если кажется, что клиенты работают сейчас).

Теперь, когда возникает проблема, вы можете использовать как команду netstat, так и команду telnet, чтобы определить причину проблемы. Во-первых, используйте netstat, чтобы убедиться, что приложение все еще прослушивает порт, который он должен прослушивать. Если это не так, проблема в вашем приложении или в том, как оно взаимодействует с ОС.

Если приложение все еще правильно слушает, вы можете использовать telnet с локального хоста и с удаленных компьютеров Windows, чтобы увидеть, где заблокировано соединение. То есть, если вы можете успешно подключиться к серверу по локальной сети на сервере, вы знаете, что приложение и сетевой стек работают хорошо, и что-то на сервере или в сети блокирует соединение (брандмауэр, программное обеспечение безопасности и т. д.). Вы также можете попробовать telnet <local ip> <port> вместо использования localhost . Если одно работает, а другое нет, это еще один индикатор того, что блокирует соединение на сервере, или слушатель может быть настроен неправильно.

Я бы в поисках программного обеспечения безопасности, которое установлено на сервере или клиенте. Особенно "тяжелые", такие как McAfee или Norton. Эти продукты являются причиной многих разбитых надежд и мечтаний. Не просто отключить их и вычеркнуть их из списка. Удалите их - это единственный способ быть уверенным, и даже тогда иногда они ломают вещи и нуждаются в большей уборке.

Без дальнейших подробных подробностей о вашей сетевой инфраструктуре и сервере / приложении дальнейших ответов нет. Все дело в устранении неполадок и устранении проблем.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .