unix - Ocaml 客户端-服务器:客户端在尝试连接时返回 EAGAIN
问题描述
我正在尝试在我的计算机和朋友的 utop 之间在 OCaml 中建立一个简单的客户端服务器。但是,当我,客户端尝试连接到我朋友的计算机。返回以下内容
Unix.Unix_error (Unix.EAGAIN, "connect", "")
我们尝试遵循以下文档https://caml.inria.fr/pub/docs/oreilly-book/html/book-ora187.html以及 ocaml API 参考。
服务器代码
let s = socket PF_INET SOCK_STREAM 0 in
try
bind s addr;
listen s 1000;
s
with z -> close s; raise z;;
val install_tcp_server_socket : sockaddr -> file_descr = <fun>
─( 17:17:32 )─< command 29 >─────────────────────────────────────────────────────────────{ counter: 0 }─
utop # let working = install_tcp_server_socket (ADDR_INET ((inet_addr_of_string "10.128.156.94"), 5002));;
val working : file_descr = <abstr>
─( 17:17:52 )─< command 30 >─────────────────────────────────────────────────────────────{ counter: 0 }─
utop # let (connect, client) = accept working;;
客户代码
utop # let s = Unix.socket (PF_INET) (Unix.SOCK_STREAM) 0;;
val s : Unix.file_descr = <abstr>
─( 17:54:10 )─< command 5 >──────────────────────────────────────────────────────────────────────────────{ counter: 0 }─
utop # let s_addr = Unix.sockaddr ((Unix.inet_addr_of_string "10.128.156.94"), 5002);;
Line 1, characters 13-26:
Error: Unbound value Unix.sockaddr
─( 18:12:32 )─< command 6 >──────────────────────────────────────────────────────────────────────────────{ counter: 0 }─
utop # let s_addr = Unix.ADDR_INET ((Unix.inet_addr_of_string "10.128.156.94"), 5002);;
val s_addr : Unix.sockaddr = Unix.ADDR_INET (<abstr>, 5002)
─( 18:13:55 )─< command 7 >──────────────────────────────────────────────────────────────────────────────{ counter: 0 }─
utop # Unix.connect s s_addr;;
Exception: Unix.Unix_error (Unix.EAGAIN, "connect", "").
─( 18:14:31 )─< command 8 >──────────────────────────────────────────────────────────────────────────────{ counter: 0 }─
utop #
解决方案
我刚刚在这里的两个系统上尝试了您的代码,它对我有用。服务器端是 Linux(Ubuntu),客户端是 macOS。
该connect
调用不应该返回 EAGAIN。这不是记录在案的错误之一。但是我在网上看到喋喋不休的说 Linux 内核无论如何都会这样做“当对等方的积压队列已满时”。如果您窥探服务器系统的日志文件,您可能会发现一些有趣的东西。
您也可以尝试使用较小的积压队列大小值。您正在使用的代码使用 3,但您使用的是 1000。这可能无关紧要,实际上它可能不会有任何区别。但这是我看到的唯一不寻常的事情。
推荐阅读
- python - sqlalchemy.exc.ArgumentError: Object category_tb('23','cat1','cat1desc','0') 作为 SQL 文字值不合法
- php - PHP Mailer 无法在 Live Server 上运行,但在 localhost 上运行良好
- python - 如何可视化 Conv1D 层中的内核?
- java - 如何在 Mockito 中模拟类型转换实例
- php - 请求回调 url 的数据
- deno - deno 安装和 deno 编译之间有什么区别?
- ansible - 有没有办法从 Ansible 中的下载链接中获取文件的文件名
- react-native - 如何在世博会的一个上传按钮中实现图像和 pdf 选择器?
- ruby - Rubocop 安装(机器:linux-gnu,Ubuntu)
- python - 如何编写与此 MatLab For Loop 等效的 Python