Долгосрочные соединения TCP / IP

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

В Windows: An existing connection was forcibly closed by the remote host

В Linux: Connection timed out

Я поискал в Интернете и нашел несколько сообщений, в которых предлагается увеличить / уменьшить время жизни ОС. Однако у меня это не сработало.

Могу ли я найти причину этой проблемы или просто попытаться переподключиться к серверу при принудительном закрытии соединения?

РЕДАКТИРОВАТЬ: Я отслеживал ситуацию. Я отправил данные на удаленный узел и отправил другие данные через 5 часов ожидания. Отправляющая сторона отправила первые данные, но, поскольку отправитель отправил вторые данные, она не ответила. Стек TCP / IP отправителя повторил это 5 раз, увеличивая время между попытками. Наконец, отправитель сбросил соединение. Я не могу понять, почему это происходит (возможно, из-за брандмауэра или NAT - см. Раздел 2.4), но я применил два разных подхода к решению этой проблемы:

  1. Использование TCP / IP для проверки активности с помощью setsockopt (раздел 4.2)
  2. Сделайте уровень приложения живым. Это более надежно, поскольку первый подход связан с ОС.

person Ricardo Cristian Ramirez    schedule 10.05.2014    source источник
comment
Вы читали этот вопрос / ответ: stackoverflow.com/questions/2582036/   -  person jdiver    schedule 10.05.2014
comment
Читаю сейчас. Я буду отслеживать обмен данными через wirehark, спасибо.   -  person Ricardo Cristian Ramirez    schedule 10.05.2014


Ответы (1)


Это зависит от того, что должно делать ваше приложение. Немного дополнительной информации и, возможно, кода, который вы используете для прослушивания и обработки соединений, могут помочь.

Тем не менее, технически более длительное время жизни должно предотвратить отключение ОС. Так что, возможно, проблема связана с чем-то другим.

Это может быть неисправность маршрутизатора или трафик, из-за которого ваш пакет keep-alive теряется. Если вы еще не тестируете его в локальной сети (без большого трафика), я предлагаю это сделать.

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

Я не привык к тому, как обрабатываются соединения в Linux, но я ожидаю, что ОС не прервет соединение без надобности. Вы можете восстановить соединение в качестве восстановления, но вы должны принять во внимание, что не все отключения являются плавными, и, следовательно, вы можете в конечном итоге восстановить соединение, которое вы действительно хотите закрыть.

Поскольку это TCP, он сделает все возможное, чтобы выполнить плавное отключение, но вы можете отправить собственное сообщение, указывающее серверу или клиенту не восстанавливать соединение непосредственно перед отключением. Так вы будете абсолютно уверены, даже если в этом нет необходимости.

person Elias ringhauge    schedule 10.05.2014