简体   繁体   中英

Simple UDP server OCaml/Async

I'm trying to do a simple UDP server using OCaml and the Async API but I'm stuck. I can't make this simple example work.

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 

I test it with:

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

Nothing happens in my program. I tried to investigate with other tools.

I see a destination unreachable packet with Wireshark and lsof shows me this:

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

What am I doing wrong here?

The code looks ok to me. I think localhost is resolved to IPv6 address by default, and you just send it there.

Try to force using IPv4 protocol

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

or specify explicit IPv4 address

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM