Разъём boost1.62 сломан после переподключения в Docker-контейнере - PullRequest
1 голос
/ 15 октября 2019

у нас есть приложение c ++ с boost1.62 и libssl1.0, которое открывает TLS-соединение с веб-сервером lighttpd (удаленно).

Это прекрасно работает на любом устройстве, которое мы уже развернули. Сейчас мы пытаемся использовать это приложение внутри контейнера. Приложение запускается, и все в порядке, но.

Когда соединение по какой-либо причине сбрасывается, приложение пытается восстановить соединение, установив новое TCP-соединение с сокетом.

Создание HTTPS-соединения с TLS через этот сокет завершается неудачно с EOF. Затем приложение пытается восстановить соединение и получает ту же ошибку -> бесконечный цикл повторного подключения.

Я записал трафик и увидел следующее:

  1. Все в порядке
  2. TLS-Alert записывается, иногда также сбрасывается TCP.
  3. Клиент отправляет SYN
  4. Сервер отправляет SYN ACK
  5. Клиент отправляет ACK
  6. Клиент отправляетFIN, ACK
  7. Сервер отправляет ACK
  8. Сервер отправляет FIN, ACK
  9. Клиент отправляет ACK

Шаги с 3 по 7 выполняются менее чем за 3Миз. как только шаг 7 пройден, устанавливается новое соединение, начиная с шага 3.

Я использую Ubuntu 18.04 на хосте и в качестве базового образа. (Оба x64) И хост, и контейнер используют одни и те же библиотеки. Поэтому я думаю, что это не проблема с используемыми библиотеками.

Приложение работает более года на нескольких устройствах arm32v7 и x64. Эта ошибка никогда не возникала.

Как ни странно, если приложение настроено на использование простого HTTP вместо HTTPS, ошибка не возникает.

Есть предложения, что это может быть? Основываясь на моих знаниях, я могу исключить следующее:

  • неверные зависимости
  • неверно настроенное ядро ​​(контейнер и хост используют одно и то же)

Спасибо за вашепомощь

1 Ответ

0 голосов
/ 22 октября 2019

После отключения мы повторно использовали старую розетку. Это работает безупречно снаружи докера. Внутри докера он выдает описанное поведение.

Обходной путь: удалите сломанный сокет и создайте новый.

Хотя это плохо сказывается на производительности.

...