У меня есть приложение на C #, которое работает нормально в течение нескольких лет. Он подключается через сокет TCP / IP к машине, которая отправляет мне биржевые сделки.
Недавно я попытался развернуть его на некоторых машинах в новом центре обработки данных, который находится за аппаратным брандмауэром, и я начал видеть некоторые странные разъединения.
Когда происходит разъединение, в моем приложении (на стороне клиента) я не вижу ничего необычного, кроме того, что я прекращаю получать данные через сокет. Wireshark подтверждает, что данные не доходят до сокета, и поток получения моего приложения блокирует вызов Receive (), когда я останавливаю его в отладчике. Сокет отображается как УСТАНОВЛЕННЫЙ в netstat.
Но со стороны сервера похоже, что мой клиент отключается. Глядя на их журналы, похоже, что сокет на их конце обычно заканчивается либо (nRecvd = -1, errno = 104), либо (nRecvd = 0, errno = 11). (104 - это сброс соединения по пиру).
Отключение происходит только после периода бездействия. Сейчас я решил эту проблему, установив сердцебиение между моим клиентом и его сервером, которое просто отправляет короткое сообщение каждые 20 секунд и получает ответ. Это привело к тому, что количество разъединений за последние несколько дней сократилось до 0.
Сначала я подумал, что проблема в аппаратном брандмауэре. Это вызывало таймаут сокета после бездействия. Но ответственный за брандмауэр утверждает, что время ожидания подключения к этому порту (8887) составляет 2160 минут.
Я использую Windows Server 2003 и .NET 3.5. Торговый сервер - это машина Linux (sles9, хотя я не уверен).
Есть идеи о том, что может происходить? Что я могу сделать для устранения этой неполадки, если у меня нет доступа к журналам брандмауэра и нет возможности изменить код на торговом сервере?
Спасибо,
Mike