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