Я пишу прокси-сервер, который прокси-соединения SSL, и все это прекрасно работает для нормального трафика. Однако, когда происходит большая передача файла (что-нибудь более 20 КБ), например, вложение электронной почты, тогда соединение сбрасывается на уровне TCP, прежде чем файл будет завершен при записи. Я использую неблокирующий ввод-вывод и порождаю поток для каждого конкретного соединения.
Когда приходит соединение, я делаю следующее:
- порождение темы
- Подключение к клиенту (незашифрованное) и чтение запроса на подключение (все остальные запросы игнорируются)
- Создание безопасного соединения (SSL с использованием OpenSSL API) к серверу
- Сообщите клиенту, что мы связались с сервером (в незашифрованном виде)
- Создайте безопасное соединение с клиентом и начните проксировать данные между ними, используя цикл выбора, чтобы определить, когда может произойти чтение и запись
- Как только нижележащие сокеты закрываются или возникает ошибка, соединение закрывается и поток прерывается.
Как я уже сказал, это прекрасно работает для данных нормального размера (обычные веб-страницы и т. Д.), Но происходит сбой, как только файл становится слишком большим с кодом ошибки (в зависимости от используемого веб-приложения) или ошибкой: соединение Прерванный.
Я понятия не имею, что вызывает закрытие соединения, является ли это чем-то специфичным для TCP, HTTP или SSL, и я вообще не могу найти никакой информации об этом. В некоторых браузерах он начнет работать, если я добавлю оператор сна сразу после SSL_write, но, похоже, это вызывает другие проблемы в других браузерах. Сон не должен быть длинным, просто задержка. В настоящее время у меня установлено значение 4 мс на запись и 2 мс на чтение, и это полностью исправляет это в старых версиях Firefox, Chrome с загрузкой HTTP и Opera.
Буду признателен за любые предложения, и дайте мне знать, если вам нужна дополнительная информация. Спасибо заранее!
-Sam