2017-08-20 5 views
1

Ich versuche, einen einfachen UDP-Server mit OCaml und der Async-API zu tun, aber ich bin fest. Ich kann dieses einfache Beispiel nicht funktionieren lassen.Einfache UDP-Server OCaml/Async

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 

Ich teste es mit:

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

Nichts in meinem Programm passiert. Ich habe versucht, mit anderen Tools zu untersuchen. diese

Ich sehe ein destination unreachable Paket mit Wireshark und lsof zeigt mir:

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

Was mache ich falsch hier?

Antwort

3

Der Code sieht für mich ok aus. Ich denke, localhost ist standardmäßig in IPv6-Adresse aufgelöst, und Sie senden es nur dort.

Versuchen IPv4 zu erzwingen Protokoll

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

oder geben explizite IPv4-Adresse

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

Danke, arbeiten beide Befehle. Tritt diese Verwechslung mit TCP auf? Ich hatte nie Probleme mit 'nc' mit' localhost'. – Nemo

+1

@Nemo vielleicht Systeme werden nur mehr IPv6-kompatibel, wer weiß) Überprüfen Sie diese https://tools.ietf.org/html/rfc3484#section-10.3. Es scheint, dass IPv6-Adressen standardmäßig Vorrang vor IPv4-Adressen haben. Sie können den Vorrang in '/ etc/gai.conf' zumindest auf Linux-Systemen ändern. Überprüfen Sie auch, wie "getaddrinfo" funktioniert. – Stas