83 lines
2.2 KiB
Text
83 lines
2.2 KiB
Text
import Std.Async
|
||
import Std.Internal.UV
|
||
import Std.Net.Addr
|
||
|
||
open Std.Async
|
||
open Std.Net
|
||
|
||
-- Using this function to create IO Error. For some reason the assert! is not pausing the execution.
|
||
def assertBEq [BEq α] [ToString α] (actual expected : α) : IO Unit := do
|
||
unless actual == expected do
|
||
throw <| IO.userError <|
|
||
s!"expected '{expected}', got '{actual}'"
|
||
|
||
--------------------------------------------------------------
|
||
|
||
/-- Mike is another client. -/
|
||
def runMike (client: TCP.Socket.Client) : Async Unit := do
|
||
let mes ← client.recv? 1024
|
||
assertBEq (String.fromUTF8? =<< mes) (some "hi mike!! :)")
|
||
client.send (String.toUTF8 "hello robert!!")
|
||
client.shutdown
|
||
|
||
/-- Joe is another client. -/
|
||
def runJoe (client: TCP.Socket.Client) : Async Unit := do
|
||
let mes ← client.recv? 1024
|
||
assertBEq (String.fromUTF8? =<< mes) (some "hi joe! :)")
|
||
client.send (String.toUTF8 "hello robert!")
|
||
client.shutdown
|
||
|
||
/-- Robert is the server. -/
|
||
def runRobert (server: TCP.Socket.Server) : Async Unit := do
|
||
let joe ← server.accept
|
||
let mike ← server.accept
|
||
|
||
joe.send (String.toUTF8 "hi joe! :)")
|
||
let mes ← joe.recv? 1024
|
||
assertBEq (String.fromUTF8? =<< mes) (some "hello robert!")
|
||
|
||
mike.send (String.toUTF8 "hi mike!! :)")
|
||
let mes ← mike.recv? 1024
|
||
assertBEq (String.fromUTF8? =<< mes) (some "hello robert!!")
|
||
|
||
pure ()
|
||
|
||
def clientServer (addr : SocketAddress) : IO Unit := do
|
||
let server ← TCP.Socket.Server.mk
|
||
server.bind addr
|
||
server.listen 128
|
||
|
||
let serverTask := runRobert server
|
||
|
||
let serverTask ← serverTask.toIO
|
||
|
||
assertBEq (← server.getSockName).port addr.port
|
||
|
||
let joe ← TCP.Socket.Client.mk
|
||
let task ← joe.connect addr |>.toBaseIO
|
||
task.block
|
||
|
||
assertBEq (← joe.getPeerName).port addr.port
|
||
|
||
joe.noDelay
|
||
|
||
let mike ← TCP.Socket.Client.mk
|
||
let task ← mike.connect addr |>.toBaseIO
|
||
task.block
|
||
|
||
assertBEq (← mike.getPeerName).port addr.port
|
||
|
||
mike.noDelay
|
||
|
||
let joeTask := runJoe joe
|
||
let mikeTask := runMike mike
|
||
|
||
let joeTask ← joeTask.toIO
|
||
let mikeTask ← mikeTask.toIO
|
||
|
||
serverTask.block
|
||
joeTask.block
|
||
mikeTask.block
|
||
|
||
#eval clientServer (SocketAddressV4.mk (.ofParts 127 0 0 1) 8084)
|
||
#eval clientServer (SocketAddressV6.mk (.ofParts 0 0 0 0 0 0 0 1) 9000)
|