FIN получен с сервера, но соединение зависает с libcurl

0

Я использую libcurl, и мне нужна некоторая информация для проблемы, с которой я столкнулся сейчас, когда "соединение кажется мертвым"

Для защищенной передачи сообщений я использую libcurl, чтобы выполнить с поддержкой SSL (TLS) для подключения к серверу.

Однако по поводу проблемы, с которой я столкнулся, я не вижу достаточной информации в Интернете (возможно, я не ищу правильные слова)

На высоком уровне это то, что происходит. Я могу успешно установить соединение с сервером, и я могу отправлять-получать данные. Если я задержу сеанс в течение небольшого окна (15 секунд), а затем запускаю дальнейшие транзакции/сообщения, я вижу, что "Соединение кажется мертвым" и "повторно подключиться" в журналах консоли из libcurl. Но он висит там и разрывается, когда завиток уходит естественным путем.

Я уволил "wirehark" и проанализировал, что я получил пакеты "FIN, ACK" и "ACK" с сервера, прежде чем я начну повторно использовать существующее соединение. Но так как я подождал довольно много времени, чтобы ответить на сервер с ACK от клиента к серверу, я думаю, что сервер не выполняет ни одного из моих будущих запросов.

Есть ли способ, когда я могу сразу ответить на сервер для FIN, ACK, полученных во время соединения?

Это проблема с libcurl, или я должен поговорить с командой сервера, почему я вижу FIN, ACK в середине моего коннекта

  • 0
    Я бы предложил оба. Сервер не должен закрывать соединение после 15 секунд простоя, но libcurl должен распознавать его как закрытие, что, похоже, не делает. Кроме того, до FIN должно было быть уведомление о закрытии SSL, и libcurl должен был это также распознать. Или, может быть, вы не признаете конец, если поток в коде приложения?
  • 0
    Я пытался, но я не вижу никакого уведомления вообще. Только когда следующий запрос будет отправлен, libcurl проверяет состояние перед повторным использованием соединения из пакета, а затем пытается к тому времени закрыть это, возможно, будет достаточно задержано, чтобы сервер мог перейти к FIN_WAIT, и из-за этого мой опыт применения уровень бесконечный "завис". Но я попробовал одно решение, которое, кажется, работает: проверить ПОСЛЕДНЮЮ РОЗЕТКУ, прежде чем пытаться установить опцию для curlHandle, когда она ПЛОХАЯ, я вызываю easy_cleanup () и затем вызываю easy_init (). Но все еще не уверен в этом. Любой комментарий?
Теги:
ssl
libcurl
wireshark

1 ответ

-1

У вас есть постоянная поддержка TCP между клиентом/сервером. Проверьте значение keep, которое вы указали в curl. Правильный интервал продолжительности жизни будет гарантировать, что соединение будет живым, если клиенту нечего отправлять.

Из справки libcurl help: CURLOPT_TCP_KEEPALIVE

Пройти по. Если установлено значение 1, будут отправлены пробники keepalive TCP. Задержку и частоту этих зондов можно контролировать с помощью опций CURLOPT_TCP_KEEPIDLE и CURLOPT_TCP_KEEPINTVL, если операционная система поддерживает их. Установите значение 0 (поведение по умолчанию) для отключения зонда keepalive

  • 0
    Я пытался, к сожалению, мне это тоже не помогло
  • 0
    Как сохранить интервал в вашем случае. Вы видели, что SYNC выходил с этим интервалом? Если сервер все еще отправляет FIN, мы должны проверить логику сервера. U сказал, что рукопожатие SSL было в порядке, и данные были обменены .. так что это не проблема SSL.
Показать ещё 2 комментария

Ещё вопросы

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