func main() { golog.SetAllLoggers(gologging.INFO) // Change to DEBUG for extra info listenF := flag.Int("l", 0, "wait for incoming connections") target := flag.String("d", "", "target peer to dial") secio := flag.Bool("secio", false, "enable secio") flag.Parse() if *listenF == 0 { log.Fatal("Please provide a port to bind on with -l") } listenaddr := fmt.Sprintf("/ip4/127.0.0.1/tcp/%d", *listenF) ha, err := makeBasicHost(listenaddr, *secio) if err != nil { log.Fatal(err) } // Set a stream handler on host A ha.SetStreamHandler("/echo/1.0.0", func(s net.Stream) { log.Println("Got a new stream!") defer s.Close() doEcho(s) }) if *target == "" { log.Println("listening for connections") select {} // hang forever } // This is where the listener code ends ipfsaddr, err := ma.NewMultiaddr(*target) if err != nil { log.Fatalln(err) } pid, err := ipfsaddr.ValueForProtocol(ma.P_IPFS) if err != nil { log.Fatalln(err) } peerid, err := peer.IDB58Decode(pid) if err != nil { log.Fatalln(err) } tptaddr := strings.Split(ipfsaddr.String(), "/ipfs/")[0] // This creates a MA with the "/ip4/ipaddr/tcp/port" part of the target tptmaddr, err := ma.NewMultiaddr(tptaddr) if err != nil { log.Fatalln(err) } // We need to add the target to our peerstore, so we know how we can // contact it ha.Peerstore().AddAddr(peerid, tptmaddr, peerstore.PermanentAddrTTL) log.Println("opening stream") // make a new stream from host B to host A // it should be handled on host A by the handler we set above s, err := ha.NewStream(context.Background(), peerid, "/echo/1.0.0") if err != nil { log.Fatalln(err) } _, err = s.Write([]byte("Hello, world!")) if err != nil { log.Fatalln(err) } out, err := ioutil.ReadAll(s) if err != nil { log.Fatalln(err) } log.Printf("read reply: %q\n", out) }
func main() { listenF := flag.Int("l", 0, "wait for incoming connections") target := flag.String("d", "", "target peer to dial") secio := flag.Bool("secio", false, "enable secio") flag.Parse() listenaddr := fmt.Sprintf("/ip4/0.0.0.0/tcp/%d", *listenF) ha, err := makeDummyHost(listenaddr, *secio) if err != nil { log.Fatal(err) } // Set a stream handler on host A ha.SetStreamHandler("/echo/1.0.0", func(s net.Stream) { log.Println("Got a new stream!") defer s.Close() }) if *target == "" { log.Println("listening for connections...") select {} // hang forever } ipfsaddr, err := ma.NewMultiaddr(*target) if err != nil { log.Fatalln(err) } pid, err := ipfsaddr.ValueForProtocol(ma.P_IPFS) if err != nil { log.Fatalln(err) } peerid, err := peer.IDB58Decode(pid) if err != nil { log.Fatalln(err) } tptaddr := strings.Split(ipfsaddr.String(), "/ipfs/")[0] tptmaddr, err := ma.NewMultiaddr(tptaddr) if err != nil { log.Fatalln(err) } pi := pstore.PeerInfo{ ID: peerid, Addrs: []ma.Multiaddr{tptmaddr}, } log.Println("connecting to target") err = ha.Connect(context.Background(), pi) if err != nil { log.Fatalln(err) } log.Println("opening stream...") // make a new stream from host B to host A // it should be handled on host A by the handler we set s, err := ha.NewStream(context.Background(), peerid, "/hello/1.0.0") if err != nil { log.Fatalln(err) } _, err = s.Write([]byte("Hello world of peer two peer")) if err != nil { log.Fatalln(err) } out, err := ioutil.ReadAll(s) if err != nil { log.Fatalln(err) } log.Println("GOT: ", string(out)) }