2017-08-20 7 views
1

J'essaye de faire un simple serveur UDP en utilisant OCaml et l'API Async mais je suis bloqué. Je ne peux pas faire fonctionner cet exemple simple.Simple serveur UDP 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 

-je tester avec:

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

Rien ne se passe dans mon programme. J'ai essayé d'enquêter avec d'autres outils.

Je vois un paquet destination unreachable avec Wireshark et lsof me montre ceci:

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

ce que je fais mal ici?

Répondre

3

Le code me semble correct. Je pense que localhost est résolu à l'adresse IPv6 par défaut, et vous l'envoyez juste là.

Essayez de forcer l'utilisation du protocole IPv4

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

ou spécifier l'adresse IPv4 explicite

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

Merci, les deux commandes fonctionnent. Est-ce que cette confusion se pose avec TCP? Je n'ai jamais eu de problème en utilisant 'nc' avec' localhost'. – Nemo

+1

@Nemo peut-être que les systèmes deviennent plus conformes IPv6, qui sait) Cochez cette https://tools.ietf.org/html/rfc3484#section-10.3. Il semble que les adresses IPv6 ont une priorité plus élevée que les adresses IPv4 par défaut. Vous pouvez changer la précédence dans '/ etc/gai.conf' au moins sur le système Linux. Aussi, vérifiez comment 'getaddrinfo' fonctionne. – Stas