OCaml-ssl с Unix.select приводит к ошибкам чтения - PullRequest
0 голосов
/ 30 мая 2019

Я использую SSL для чтения данных из различных удаленных служб через безопасные веб-сокеты следующим образом: я создаю сокет, встраиваю его в контекст SSL и добавляю сокет в список чтения для Unix.select. Когда запускается сокет, я использую Ssl.read для получения данных.

4 службы работают хорошо. И с одним я получаю Ssl.Read_error.Error_syscall: ошибка: 00000000: lib (0): func (0): причина (0) после получения каждого кадра веб-сокета (размер ~ 5-6Kb). Кстати, здесь кадры намного больше, чем на других сервисах, но я не уверен, что причина в этом.

Я игнорирую ошибки системного вызова (и, скорее всего, теряю некоторые данные), потому что кадры продолжают поступать. Затем всегда через одну минуту я получаю Ssl.Read_error.Error_zero_return: error: 00000000: lib (0): func (0): reason (0), что означает закрытый сокет SSL сокета для записи, и я должен перезапустить процесс, потому что новые данные не будут получены из этого сокета.

Проблема прекрасно воспроизводима. В то же время примеры для этого сервиса и моей собственной реализации теста с Node.JS без проблем получают данные в течение нескольких часов.

Я предполагаю, что я что-то делаю не так или слишком просто настраиваю сокет / SSL (см. Ниже).

Любая помощь или идеи будут высоко оценены.

let sock = Unix.socket PF_INET SOCK_STREAM 0 in
let laddr = Unix.inet_addr_of_string p.interface in
Unix.bind sock (ADDR_INET (laddr,0));
Unix.connect sock addr;
let (sock, res) =
let req = Bytes.of_string http_request in
if ssl then begin
  Ssl.init ();
  let ctx = create_context TLSv1_2 Client_context in
  let sock = Ssl.embed_socket sock ctx in
  Ssl.connect sock;
  (SslSock sock, (write sock req 0 http_request_len))
end else
  (UnixSock sock, (Unix.write sock req 0 http_request_len))

1 Ответ

0 голосов
/ 31 мая 2019

WireShark сделал свое дело: этот «плохой» сервис отправляет два кадра веб-сокета в одном пакете tcp, где второй кадр имеет нулевую длину полезной нагрузки.Естественно, моя реализация Websocket неправильно обрабатывает кадры с нулевой полезной нагрузкой, что приводит к отсутствию кадров Ping и закрытию соединения TCP удаленным сервером.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...