main.go 2.56 KB
Newer Older
Jeromy's avatar
Jeromy committed
1
2
3
4
5
6
7
8
9
package main

import (
	"flag"
	"fmt"
	"io/ioutil"
	"log"

	pstore "github.com/ipfs/go-libp2p-peerstore"
10
11
12
13
14
15
16
	host "github.com/libp2p/go-libp2p/p2p/host"
	bhost "github.com/libp2p/go-libp2p/p2p/host/basic"
	metrics "github.com/libp2p/go-libp2p/p2p/metrics"
	net "github.com/libp2p/go-libp2p/p2p/net"
	conn "github.com/libp2p/go-libp2p/p2p/net/conn"
	swarm "github.com/libp2p/go-libp2p/p2p/net/swarm"
	testutil "github.com/libp2p/go-libp2p/testutil"
Jeromy's avatar
Jeromy committed
17
18
19
20
21
22

	ipfsaddr "github.com/ipfs/go-ipfs/thirdparty/ipfsaddr"
	ma "github.com/jbenet/go-multiaddr"
	context "golang.org/x/net/context"
)

Jeromy's avatar
Jeromy committed
23
24
25
26
27
28
func init() {
	// Disable secio for this demo
	// This makes testing with javascript easier
	conn.EncryptConnections = false
}

Jeromy's avatar
Jeromy committed
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
// create a 'Host' with a random peer to listen on the given address
func makeDummyHost(listen string) (host.Host, error) {
	addr, err := ma.NewMultiaddr(listen)
	if err != nil {
		return nil, err
	}

	pid, err := testutil.RandPeerID()
	if err != nil {
		return nil, err
	}

	// bandwidth counter, should be optional in the future
	bwc := metrics.NewBandwidthCounter()

	// create a new swarm to be used by the service host
	netw, err := swarm.NewNetwork(context.Background(), []ma.Multiaddr{addr}, pid, pstore.NewPeerstore(), bwc)
	if err != nil {
		return nil, err
	}

	log.Printf("I am %s/ipfs/%s\n", addr, pid.Pretty())
	return bhost.New(netw), nil
}

func main() {
Jeromy's avatar
Jeromy committed
55

Jeromy's avatar
Jeromy committed
56
57
58
59
60
61
62
63
64
65
66
67
	listenF := flag.Int("l", 0, "wait for incoming connections")
	target := flag.String("d", "", "target peer to dial")
	flag.Parse()

	listenaddr := fmt.Sprintf("/ip4/0.0.0.0/tcp/%d", *listenF)

	ha, err := makeDummyHost(listenaddr)
	if err != nil {
		log.Fatal(err)
	}

	message := []byte("hello libp2p!")
Jeromy's avatar
Jeromy committed
68

Jeromy's avatar
Jeromy committed
69
70
71
72
73
74
75
76
	// Set a stream handler on host A
	ha.SetStreamHandler("/hello/1.0.0", func(s net.Stream) {
		defer s.Close()
		log.Println("writing message")
		s.Write(message)
	})

	if *target == "" {
Jeromy's avatar
Jeromy committed
77
78
		log.Println("listening for connections...")
		select {} // hang forever
Jeromy's avatar
Jeromy committed
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
	}

	a, err := ipfsaddr.ParseString(*target)
	if err != nil {
		log.Fatalln(err)
	}

	pi := pstore.PeerInfo{
		ID:    a.ID(),
		Addrs: []ma.Multiaddr{a.Transport()},
	}

	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
100
	s, err := ha.NewStream(context.Background(), a.ID(), "/hello/1.0.0")
Jeromy's avatar
Jeromy committed
101
102
103
104
105
106
107
108
109
110
111
112
	if err != nil {
		log.Fatalln(err)
	}

	log.Println("reading message")
	out, err := ioutil.ReadAll(s)
	if err != nil {
		log.Fatalln(err)
	}

	log.Println("GOT: ", string(out))
}