Клиент-сервер Ocaml: клиент возвращает EAGAIN при попытке подключения - PullRequest
0 голосов
/ 10 ноября 2019

Я пытаюсь установить простой клиент-сервер в OCaml между моим компьютером и другом на утопе. Тем не менее, когда я, клиент пытается подключиться к компьютеру моего друга. Возвращается следующее

Unix.Unix_error (Unix.EAGAIN, "connect", "")

Мы пытались следовать следующей документации https://caml.inria.fr/pub/docs/oreilly-book/html/book-ora187.html, а также справочнику API ocaml.

код сервера

  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 #

1 Ответ

0 голосов
/ 10 ноября 2019

Я только что попробовал ваш код на двух системах здесь, и он работает для меня. На стороне сервера была Linux (Ubuntu), а на стороне клиента - macOS.

Вызов connect не должен возвращать EAGAIN. Это не одна из документированных ошибок. Тем не менее, я вижу в сети болтовню о том, что ядро ​​Linux делает это в любом случае «когда очередь невыполненных заданий однорангового узла заполнена». Возможно, если вы покопаетесь в файлах журналов серверной системы, вы увидите что-то интересное.

Вы также можете попробовать использовать меньшее значение для размера очереди невыполненных работ. Код, из которого вы работаете, использует 3, но вы используете 1000. Это, вероятно, не должно иметь значения, и фактически это, вероятно, не будет иметь никакого значения. Но это единственное необычное, что я вижу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...