Простой UDP-сервер OCaml/Async

Я пытаюсь сделать простой UDP-сервер, используя OCaml и Async API, но я застрял. Я не могу заставить этот простой пример работать.

let wait_for_datagram () : unit Deferred.t = 
  let port = 9999 in
  let addr = Socket.Address.Inet.create Unix.Inet_addr.localhost ~port in
  let%bind socket = Udp.bind addr in 
  let socket = Socket.fd socket in
  let stop = never () in
  let config = Udp.Config.create ~stop () in
  let callback buf _ : unit = failwith "got a datagram" in
  Udp.recvfrom_loop ~config socket callback 

Я проверяю это с:

echo -n "hello goodbye" > /dev/udp/localhost/9999

В моей программе ничего не происходит. Я пытался исследовать с помощью других инструментов.

я вижу destination unreachable пакет с Wireshark и lsof показывает мне это:

> lsof -i :9999 
COMMAND    PID     USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
main.exe 77564     nemo   5u   IPv4 0x25251bcc3485235f      0t0  UDP localhost:distinct

Что я здесь не так делаю?

1 ответ

Решение

Код выглядит нормально для меня. Я думаю localhost по умолчанию разрешен к IPv6-адресу, и вы просто отправляете его туда.

Попробуйте форсировать использование протокола IPv4

echo -n "hello goodbye" | nc -4 -u -w0 localhost 9999

или укажите явный адрес IPv4

echo -n "hello goodbye" > /dev/udp/127.0.0.1/9999
Другие вопросы по тегам