Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix Ocaml客户端服务器:客户端在尝试连接时返回EAGAIN_Unix_Ocaml - Fatal编程技术网

Unix Ocaml客户端服务器:客户端在尝试连接时返回EAGAIN

Unix Ocaml客户端服务器:客户端在尝试连接时返回EAGAIN,unix,ocaml,Unix,Ocaml,我试图在OCaml中建立一个简单的客户机服务器 在我的电脑和一个朋友的utop上。但是,当我打开时,客户机试图连接到我朋友的计算机。返回以下内容: Unix.Unix\u错误(Unix.EAGAIN,“connect”和“”) 我们试图遵循以下文档以及OCAMLAPI参考 服务器代码 let s = socket PF_INET SOCK_STREAM 0 in try bind s addr; listen s 1000; s with z -> cl

我试图在OCaml中建立一个简单的客户机服务器 在我的电脑和一个朋友的utop上。但是,当我打开时,客户机试图连接到我朋友的计算机。返回以下内容:

Unix.Unix\u错误(Unix.EAGAIN,“connect”和“”)

我们试图遵循以下文档以及OCAMLAPI参考

服务器代码

  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;;
设s=socket PF_INET SOCK_流0 in
尝试
绑定s地址;
听1000美元;
s
使用z->close s;提高z;;
val安装\u tcp\u服务器\u套接字:sockaddr->file\u descr=
─( 17:17:32 )─< 命令29>─────────────────────────────────────────────────────────────{计数器:0}─
utop#let working=install_tcp_server_socket(ADDR_INET((INET_ADDR_of_string“10.128.156.94”),5002));;
val工作:文件描述=
─( 17:17:52 )─< 命令30>─────────────────────────────────────────────────────────────{计数器:0}─
utop#让(连接,客户)=接受工作;;
客户端代码

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 #
utop#让s=Unix.socket(PF_INET)(Unix.SOCK_STREAM)0;;
val s:Unix.file_descr=
─( 17:54:10 )─< 命令5>──────────────────────────────────────────────────────────────────────────────{计数器:0}─
utop#让s_addr=Unix.sockaddr((Unix.inet_addr_,of_字符串“10.128.156.94”),5002);;
第1行,字符13-26:
错误:未绑定值Unix.sockaddr
─( 18:12:32 )─< 命令6>──────────────────────────────────────────────────────────────────────────────{计数器:0}─
utop#设s_addr=Unix.addr_INET((Unix.INET_addr_,由字符串“10.128.156.94”)组成),5002);;
val s_addr:Unix.sockaddr=Unix.addr_INET(,5002)
─( 18:13:55 )─< 命令7>──────────────────────────────────────────────────────────────────────────────{计数器:0}─
utop#Unix.connect s#u addr;;
异常:Unix.Unix\u错误(Unix.EAGAIN,“connect”,“”)。
─( 18:14:31 )─< 命令8>──────────────────────────────────────────────────────────────────────────────{计数器:0}─
乌托普#

我刚刚在这里的两个系统上试用了你的代码,它对我很有效。服务器端是Linux(Ubuntu),客户端是macOS

connect
调用不应返回EAGAIN。这不是记录在案的错误之一。然而,我看到网上有人说Linux内核在“对等机的待办事项队列已满”的情况下仍会这样做。如果您在服务器系统的日志文件中四处窥探,可能会看到一些有趣的东西


您还可以尝试使用较小的待办事项队列大小值。您使用的代码使用3,但您使用的是1000。这可能不重要,事实上也不会有什么不同。但这是我看到的唯一不寻常的事情。

如果这有区别的话,这两台都是windows机器。它可能确实有区别。您可以查看EAGAIN错误的含义。也许Windows实现中有一个文档化的含义。否则我的建议也一样。EAGAIN是一个非常奇怪的错误,可能有一个非常有趣的事件出现在日志中。我想它可以在互联网上找到我朋友的电脑,但如果他将它设置为接受请求,并且他的容量足够大,理论上应该可以工作。是的,这就是它的一般含义,但当通过
connect
返回时,它可能有更具体的含义。这不是通常为
connect
操作定义的错误之一(在Unix中)。我记得它最初(几十年前)仅由
fork()
返回,以指示此时没有可用的进程槽。