首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带有Unix.select的OCaml-ssl导致读取错误

带有Unix.select的OCaml-ssl导致读取错误
EN

Stack Overflow用户
提问于 2019-05-30 22:30:34
回答 1查看 32关注 0票数 0

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

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

我忽略了syscall错误(并且很可能丢失了一些数据),因为帧会继续到达。然后,总是在一分钟后我得到Ssl.Read_error.Error_zero_return: error:00000000:lib(0):func(0):reason(0),这意味着对等方关闭了SSL套接字以进行写入,我必须重新启动进程,因为不会从该套接字接收到新数据。

问题是完全可以重现的。同时,这个服务的示例和我自己使用Node.JS的测试实现都能在几个小时内毫无问题地接收到数据。

我假设我做错了什么,或者设置套接字/SSL太简单了(见下文)。

任何帮助或想法都将受到强烈的感谢。

代码语言:javascript
运行
复制
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))
EN

回答 1

Stack Overflow用户

发布于 2019-05-31 17:44:28

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56380272

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档