aneris.examples.ping_pong.code

From aneris Require Export lang network notation tactics.
From aneris.examples.library Require Export lib.

Definition pong : ground_lang.val :=
  λ: "addr",
  let: "socket" := NewSocket #Network.PF_INET
                             #Network.SOCK_DGRAM
                             #Network.IPPROTO_UDP in
  SocketBind "socket" "addr";;
 let: "handler" :=
    (rec: "loop" "msg" "sender" :=
       (if: "msg" = #"PING" then SendTo "socket" #"PONG" "sender" else assert #false);;
        listen "socket" "loop") in
  listen "socket" "handler".

Definition ping : ground_lang.val :=
  λ: "addr" "server",
  let: "socket" := NewSocket #Network.PF_INET
                             #Network.SOCK_DGRAM
                             #Network.IPPROTO_UDP in
  SocketBind "socket" "addr";;
  SendTo "socket" #"PING" "server";;
  Fst (listen_wait "socket").

Definition ping_pong_runner :=
  "system";
     let: "pongaddr" := MakeAddress #"0.0.0.0" #80 in
     let: "pingaddr" := MakeAddress #"0.0.0.1" #80 in
     Start "pong" "0.0.0.0" (pong "pongaddr") ;;
     Start "ping" "0.0.0.1" (ping "pingaddr" "pongaddr")
  .