From 059e632d0afcdc03457a430716f74f12ee41407e Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Mon, 20 Apr 2020 17:16:28 +0700 Subject: [PATCH 1/2] add command line client and server --- cmd/client/main.go | 69 ++++++++++++++++++++++++++++++++++++++++ cmd/server/main.go | 79 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 148 insertions(+) create mode 100644 cmd/client/main.go create mode 100644 cmd/server/main.go diff --git a/cmd/client/main.go b/cmd/client/main.go new file mode 100644 index 0000000..8d391c9 --- /dev/null +++ b/cmd/client/main.go @@ -0,0 +1,69 @@ +package main + +import ( + "context" + "crypto/rand" + "fmt" + "io/ioutil" + "log" + "os" + + ic "github.com/libp2p/go-libp2p-core/crypto" + peer "github.com/libp2p/go-libp2p-core/peer" + libp2pquic "github.com/libp2p/go-libp2p-quic-transport" + ma "github.com/multiformats/go-multiaddr" +) + +func main() { + if len(os.Args) != 3 { + fmt.Printf("Usage: ./main ") + return + } + if err := run(os.Args[1], os.Args[2]); err != nil { + log.Fatalf(err.Error()) + } +} + +func run(raddr string, p string) error { + peerID, err := peer.Decode(p) + if err != nil { + return err + } + addr, err := ma.NewMultiaddr(raddr) + if err != nil { + return err + } + priv, _, err := ic.GenerateECDSAKeyPair(rand.Reader) + if err != nil { + return err + } + + t, err := libp2pquic.NewTransport(priv, nil, nil) + if err != nil { + return err + } + + log.Printf("Dialing %s\n", addr.String()) + conn, err := t.Dial(context.Background(), addr, peerID) + if err != nil { + return err + } + str, err := conn.OpenStream() + if err != nil { + return err + } + const msg = "Hello world!" + log.Printf("Sending: %s\n", msg) + if _, err := str.Write([]byte(msg)); err != nil { + return err + } + if err := str.Close(); err != nil { + return err + } + data, err := ioutil.ReadAll(str) + if err != nil { + return err + } + log.Printf("Received: %s\n", data) + return conn.Close() +} diff --git a/cmd/server/main.go b/cmd/server/main.go new file mode 100644 index 0000000..68eda3d --- /dev/null +++ b/cmd/server/main.go @@ -0,0 +1,79 @@ +package main + +import ( + "crypto/rand" + "fmt" + "io/ioutil" + "log" + "os" + + ic "github.com/libp2p/go-libp2p-core/crypto" + "github.com/libp2p/go-libp2p-core/peer" + tpt "github.com/libp2p/go-libp2p-core/transport" + libp2pquic "github.com/libp2p/go-libp2p-quic-transport" + ma "github.com/multiformats/go-multiaddr" +) + +func main() { + if len(os.Args) != 2 { + fmt.Printf("Usage: ./main ") + return + } + if err := run(os.Args[1]); err != nil { + log.Fatalf(err.Error()) + } +} + +func run(port string) error { + addr, err := ma.NewMultiaddr(fmt.Sprintf("/ip4/0.0.0.0/udp/%s/quic", port)) + if err != nil { + return err + } + priv, _, err := ic.GenerateECDSAKeyPair(rand.Reader) + if err != nil { + return err + } + peerID, err := peer.IDFromPrivateKey(priv) + if err != nil { + return err + } + + t, err := libp2pquic.NewTransport(priv, nil, nil) + if err != nil { + return err + } + + ln, err := t.Listen(addr) + if err != nil { + return err + } + fmt.Printf("Listening. Now run: go run cmd/client/main.go %s %s\n", ln.Multiaddr(), peerID) + for { + conn, err := ln.Accept() + if err != nil { + return err + } + log.Printf("Accepted new connection from %s (%s)\n", conn.RemotePeer(), conn.RemoteMultiaddr()) + go func() { + if err := handleConn(conn); err != nil { + log.Printf("handling conn failed: %s", err.Error()) + } + }() + } +} + +func handleConn(conn tpt.CapableConn) error { + str, err := conn.AcceptStream() + if err != nil { + return err + } + data, err := ioutil.ReadAll(str) + if err != nil { + return err + } + log.Printf("Received: %s\n", data) + if _, err := str.Write([]byte(data)); err != nil { + return err + } + return str.Close() +} From 487efa43c8d595993f1b697e5bd1223e98d56015 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Tue, 21 Apr 2020 10:20:35 +0700 Subject: [PATCH 2/2] apply @Stebalien's suggestions from code review Co-Authored-By: Steven Allen --- cmd/client/main.go | 2 +- cmd/server/main.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/client/main.go b/cmd/client/main.go index 8d391c9..37ede0c 100644 --- a/cmd/client/main.go +++ b/cmd/client/main.go @@ -16,7 +16,7 @@ import ( func main() { if len(os.Args) != 3 { - fmt.Printf("Usage: ./main ") + fmt.Printf("Usage: %s ", os.Args[0]) return } if err := run(os.Args[1], os.Args[2]); err != nil { diff --git a/cmd/server/main.go b/cmd/server/main.go index 68eda3d..3a5fe24 100644 --- a/cmd/server/main.go +++ b/cmd/server/main.go @@ -16,7 +16,7 @@ import ( func main() { if len(os.Args) != 2 { - fmt.Printf("Usage: ./main ") + fmt.Printf("Usage: %s ", os.Args[0]) return } if err := run(os.Args[1]); err != nil {