Я использую 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))