aneris.examples.ping_pong_done.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: "msg" := listen_wait "socket" in
  let: "sender" := Snd "msg" in
  (if: Fst "msg" = #"PING" then SendTo "socket" #"PONG" "sender" else assert #false);;
  let: "ack" := listen_wait "socket" in
  (if: Fst "ack" = #"DONE" then #() else assert #false).

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";;
  let: "msg" := listen_wait "socket" in
  if: Fst "msg" = #"PONG"
  then SendTo "socket" #"DONE" "server"
  else assert #false.

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")
  .