Клиент обычно отключается от сервера через несколько десятков минут

1

Я создал программу обмена между сервером и клиентом в.NET (С# или vb.net), используя TCPListener - Socket на порту 8080. Простыми словами, программа работает как программное обеспечение чата, клиент подключается к серверу, и оба ждут сообщения друг от друга, а затем обрабатывать его.

Чтобы получить пакет от клиента, я использую метод "Пока", например:

While true

Dim Buffer(4096) As Byte

s.Receive(Buffer)

Dim strDataReceived As String = System.Text.Encoding.ASCII.GetString(Buffer)

ProcessData(strDataReceived) 'Process data received...........

End while

При тестировании сервера server.exe-client.exe на локальном компьютере программное обеспечение отлично работает в течение нескольких часов без каких-либо проблем.

Но когда я запускаю server.exe на своем реальном сервере, соединение между сервером-клиентом обычно теряется друг с другом, когда клиент подключается через несколько десятков минут. Симптомом является отправка клиентом пакета на сервер, но сервер не получает пакет от клиента, когда сервер все еще стоит в команде sck.receive(Buffer). Я тестировал много раз, но мне все еще не повезло, что соединение длится более 1 часа.

Я исследовал эту проблему, но все еще очень странно:

  • На сервере не установлено никакого программного обеспечения брандмауэра.

  • Клиент не использовал прокси и антивирус, программное обеспечение брандмауэра

  • Я использую программное обеспечение для регистрации полосы пропускания на сервере, чтобы убедиться, что интернет на моем сервере стабилен.

  • Я делаю "ping -t" с моего клиентского компьютера на сервер и продолжаю смотреть на него, чтобы не было потерянного соединения между клиентом и сервером. Команда ping указывает, что время пинга обычно составляет от 5 мс до 50 мс, и время соединения не происходит.

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

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

Теги:
sockets

2 ответа

3
Лучший ответ

Вероятно, сервер находится за каким-то брандмауэром (Cisco ASA и т.д.), Который имеет тайм-ауты простоя. Когда вы "пробиваете" через брандмауэр/устройство NAT, в ядре брандмауэра создается "сеанс". Существует связанный ресурс, который должен быть исправлен, поэтому брандмауэры обычно не разрешают неограниченное время ожидания соединения, но брандмауэры поддерживают такие функции, как обнаружение мертвого соединения.

Добавление пакета/активности keepalive каждые 5 минут, или отключение/повторное подключение - единственный способ обойти это. Немногие сетевые администраторы собираются изменить свои конфиги, чтобы разместить это. Довольно просто реализовать команду "ping" или "keepalive" в пользовательских протоколах TCP-приложений. Просто отправьте строку и используйте ее, вам даже не нужно отвечать на пакет, чтобы выполнить сброс таймера простоя в брандмауэре, хотя это, вероятно, будет лучшей практикой.

Когда я говорю keepalive, я не имею в виду опцию TCP keepalive socket. Это пакет с нулевой длиной и обнаруживается с помощью хорошего брандмауэра, такого как Cisco. Администраторы Cisco могут настраивать правила, чтобы спокойно отказать в вашем пакете keepalive, поэтому решение должно реализовать его выше уровня TCP на уровне приложения, отправив небольшую строку данных типа "KEEPALIVE\r\n".

  • 0
    Как я уже говорил, я не устанавливаю брандмауэр на сервере. Все программное обеспечение на сервере настраивается мной с момента установки Windows, поэтому я точно не знаю, установлен ли брандмауэр.
  • 0
    То есть ваш клиент и сервер находятся в одной физической сети? Я не говорил, что у «сервера» был брандмауэр. Я имел в виду, что межсетевой экран находится между клиентом и сервером. Если они не находятся в одной сети, вы, вероятно, проходите через брандмауэр и не знаете об этом.
Показать ещё 8 комментариев
0

Покажите нам больше кодов. этого недостаточно

Ещё вопросы

Сообщество Overcoder
Наверх
Меню