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) } }