package main import "io" import "os" import "log" import "fmt" import "time" 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) // } method, reader, err := trans.ReceiveReader() if err != nil { log.Printf("CLIENT recv: %v", err) return } data, err := io.ReadAll(reader) if err != nil { log.Printf("CLIENT recv: %v", err) return } log.Println("CLIENT got", method, data) } }() // message := ping.MessagePing(0) // for { // log.Printf("<-- ping (%d)", message) // _, err := ping.Send(trans, &message) // handleErr(1, err) // message ++ // time.Sleep(time.Second) // } data := [1]byte { } for { log.Println("CLIENT send", 1, data) err := trans.Send(1, data[:]) handleErr(1, err) data[0] ++ 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 } func handleErr(code int, err error) { if err != nil { fmt.Fprintf(os.Stderr, "%s: %v\n", os.Args[0], err) os.Exit(code) } }