Простой 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