【问题标题】:OCaml-ssl with Unix.select leads to read errors带有 Unix.select 的 OCaml-ssl 导致读取错误
【发布时间】:2019-05-31 17:44:27
【问题描述】:

我使用 SSL 通过安全 websocket 从各种远程服务读取数据,如下所示:创建套接字,将其嵌入 SSL 上下文中,并将套接字添加到 Unix.select 的阅读列表中。当套接字触发时,我使用 Ssl.read 来获取数据。

4 项服务运行良好。在收到每个 websocket 帧(大小 ~5-6Kb)后,我得到一个 Ssl.Read_error.Error_syscall: error:00000000:lib(0):func(0):reason(0) 。顺便说一句,这里的框架比其他服务上的大得多,但我不确定是不是这个原因。

我忽略了系统调用错误(并且很可能丢失了一些数据),因为帧继续到达。然后,总是在一分钟后我得到 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))

【问题讨论】:

    标签: ssl select ocaml


    【解决方案1】:

    WireShark 成功了:这个“坏”服务在一个 tcp 数据包中发送两个 websocket 帧,其中第二个帧的有效负载长度为零。自然地,我的 Websocket 实现不正确地处理了零负载的帧,导致 Ping 帧丢失和远程服务器关闭 TCP 连接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-24
      • 1970-01-01
      • 1970-01-01
      • 2016-09-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多