72 lines
1.5 KiB
Go

package main
import "os"
import "io"
import "fmt"
import "log"
import "net"
import "time"
import "errors"
// import "context"
import "git.tebibyte.media/sashakoshka/hopp"
import "git.tebibyte.media/sashakoshka/hopp/examples/ping"
func main() {
name := os.Args[0]
if len(os.Args) != 2 {
fmt.Fprintf(os.Stderr, "Usage: %s HOST:PORT\n", name)
os.Exit(2)
}
address := os.Args[1]
conn, err := dial(address)
handleErr(1, err)
trans, err := conn.OpenTrans()
handleErr(1, err)
go func() {
defer fmt.Fprintf(os.Stdout, "(i) disconnected\n")
for {
message, _, err := ping.Receive(trans)
if err != nil {
if !errors.Is(err, io.EOF) {
handleErr(1, err)
}
break
}
switch message := message.(type) {
case *ping.MessagePong:
log.Printf("--> pong (%d) from %v", message, address)
}
}
}()
message := ping.MessagePing(0)
for {
log.Printf("<-- ping (%d)", message)
_, err := ping.Send(trans, &message)
handleErr(1, err)
message ++
time.Sleep(time.Second)
}
}
func dial(address string) (hopp.Conn, error) {
// ctx, done := context.WithTimeout(context.Background(), 16 * time.Second)
// defer done()
// conn, err := hopp.Dial(ctx, "tcp", address, nil)
// if err != nil { return nil, err }
// return conn, nil
underlying, err := net.Dial("tcp", address)
if err != nil { return nil, err }
conn := hopp.AdaptA(underlying, hopp.ServerSide)
return conn, nil
}
func handleErr(code int, err error) {
if err != nil {
fmt.Fprintf(os.Stderr, "%s: %v\n", os.Args[0], err)
os.Exit(code)
}
}