aneris.examples.load_balancer.lb
From aneris Require Export lang network notation tactics.
From aneris.examples.library Require Export lib list.
Definition serve : ground_lang.val :=
λ: "main" "ip" "port" "server",
let: "socket" := NewSocket #Network.PF_INET
#Network.SOCK_DGRAM
#Network.IPPROTO_UDP in
let: "addr" := MakeAddress "ip" "port" in
SocketBind "socket" "addr";;
(rec: "loop" <> :=
match: ReceiveFrom "main" with
SOME "m" => let: "msg" := Fst "m" in
let: "sender" := Snd "m" in
let: "_" := SendTo "socket" "msg" "server" in
let: "res" := Fst (listen_wait "socket") in
SendTo "main" "res" "sender";;
"loop" #()
| NONE => "loop" #()
end) #().
Definition load_balancer : ground_lang.val :=
λ: "ip" "port" "server1" "server2",
let: "socket" := NewSocket #Network.PF_INET
#Network.SOCK_DGRAM
#Network.IPPROTO_UDP in
let: "addr" := MakeAddress "ip" "port" in
SocketBind "socket" "addr";;
Fork (serve "socket" "ip" #1100 "server1");;
Fork (serve "socket" "ip" #1101 "server2").
Definition load_balancer' : ground_lang.val :=
λ: "ip" "servers",
let: "socket" := NewSocket #Network.PF_INET
#Network.SOCK_DGRAM
#Network.IPPROTO_UDP in
let: "addr" := MakeAddress "ip" #80 in
SocketBind "socket" "addr";;
list_fold (λ: "acc" "server",
Fork (serve "socket" "ip" "acc" "server");;
"acc" + #1) #1100 "servers".
From aneris.examples.library Require Export lib list.
Definition serve : ground_lang.val :=
λ: "main" "ip" "port" "server",
let: "socket" := NewSocket #Network.PF_INET
#Network.SOCK_DGRAM
#Network.IPPROTO_UDP in
let: "addr" := MakeAddress "ip" "port" in
SocketBind "socket" "addr";;
(rec: "loop" <> :=
match: ReceiveFrom "main" with
SOME "m" => let: "msg" := Fst "m" in
let: "sender" := Snd "m" in
let: "_" := SendTo "socket" "msg" "server" in
let: "res" := Fst (listen_wait "socket") in
SendTo "main" "res" "sender";;
"loop" #()
| NONE => "loop" #()
end) #().
Definition load_balancer : ground_lang.val :=
λ: "ip" "port" "server1" "server2",
let: "socket" := NewSocket #Network.PF_INET
#Network.SOCK_DGRAM
#Network.IPPROTO_UDP in
let: "addr" := MakeAddress "ip" "port" in
SocketBind "socket" "addr";;
Fork (serve "socket" "ip" #1100 "server1");;
Fork (serve "socket" "ip" #1101 "server2").
Definition load_balancer' : ground_lang.val :=
λ: "ip" "servers",
let: "socket" := NewSocket #Network.PF_INET
#Network.SOCK_DGRAM
#Network.IPPROTO_UDP in
let: "addr" := MakeAddress "ip" #80 in
SocketBind "socket" "addr";;
list_fold (λ: "acc" "server",
Fork (serve "socket" "ip" "acc" "server");;
"acc" + #1) #1100 "servers".