main.go 3.16 KB
Newer Older
Jeromy's avatar
Jeromy committed
1
2
3
package main

import (
4
	"context"
Jeromy's avatar
Jeromy committed
5
6
7
8
	"flag"
	"fmt"
	"io/ioutil"
	"log"
Jeromy's avatar
Jeromy committed
9
	"strings"
Jeromy's avatar
Jeromy committed
10

Jeromy's avatar
Jeromy committed
11
12
	bhost "github.com/libp2p/go-libp2p/p2p/host/basic"

Jeromy's avatar
Jeromy committed
13
	host "github.com/libp2p/go-libp2p-host"
Jeromy's avatar
Jeromy committed
14
15
	inet "github.com/libp2p/go-libp2p-net"
	net "github.com/libp2p/go-libp2p-net"
Jeromy's avatar
Jeromy committed
16
17
	peer "github.com/libp2p/go-libp2p-peer"
	pstore "github.com/libp2p/go-libp2p-peerstore"
Jeromy's avatar
Jeromy committed
18
	swarm "github.com/libp2p/go-libp2p-swarm"
Jeromy's avatar
Jeromy committed
19
	testutil "github.com/libp2p/go-testutil"
Jeromy's avatar
Jeromy committed
20
	ma "github.com/multiformats/go-multiaddr"
Jeromy's avatar
Jeromy committed
21
22
23
)

// create a 'Host' with a random peer to listen on the given address
Jeromy's avatar
Jeromy committed
24
func makeDummyHost(listen string, secio bool) (host.Host, error) {
Jeromy's avatar
Jeromy committed
25
26
27
28
29
	addr, err := ma.NewMultiaddr(listen)
	if err != nil {
		return nil, err
	}

Jeromy's avatar
Jeromy committed
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
	ps := pstore.NewPeerstore()
	var pid peer.ID

	if secio {
		ident, err := testutil.RandIdentity()
		if err != nil {
			return nil, err
		}

		ident.PrivateKey()
		ps.AddPrivKey(ident.ID(), ident.PrivateKey())
		ps.AddPubKey(ident.ID(), ident.PublicKey())
		pid = ident.ID()
	} else {
		fakepid, err := testutil.RandPeerID()
		if err != nil {
			return nil, err
		}
		pid = fakepid
Jeromy's avatar
Jeromy committed
49
50
	}

Jeromy's avatar
Jeromy committed
51
	ctx := context.Background()
Jeromy's avatar
Jeromy committed
52
53

	// create a new swarm to be used by the service host
Jeromy's avatar
Jeromy committed
54
	netw, err := swarm.NewNetwork(ctx, []ma.Multiaddr{addr}, pid, ps, nil)
Jeromy's avatar
Jeromy committed
55
56
57
58
59
60
61
62
63
64
65
	if err != nil {
		return nil, err
	}

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

func main() {
	listenF := flag.Int("l", 0, "wait for incoming connections")
	target := flag.String("d", "", "target peer to dial")
Jeromy's avatar
Jeromy committed
66
67
	secio := flag.Bool("secio", false, "enable secio")

Jeromy's avatar
Jeromy committed
68
69
	flag.Parse()

Lars Gierth's avatar
Lars Gierth committed
70
	listenaddr := fmt.Sprintf("/ip4/127.0.0.1/tcp/%d", *listenF)
Jeromy's avatar
Jeromy committed
71

Jeromy's avatar
Jeromy committed
72
	ha, err := makeDummyHost(listenaddr, *secio)
Jeromy's avatar
Jeromy committed
73
74
75
76
77
	if err != nil {
		log.Fatal(err)
	}

	// Set a stream handler on host A
Jeromy's avatar
Jeromy committed
78
	ha.SetStreamHandler("/echo/1.0.0", func(s net.Stream) {
Lars Gierth's avatar
Lars Gierth committed
79
80
		log.Println("got a new stream")
		doEcho(s)
Jeromy's avatar
Jeromy committed
81
82
83
84
		defer s.Close()
	})

	if *target == "" {
Lars Gierth's avatar
Lars Gierth committed
85
		log.Println("listening for connections")
Jeromy's avatar
Jeromy committed
86
		select {} // hang forever
Jeromy's avatar
Jeromy committed
87
88
	}

Jeromy's avatar
Jeromy committed
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
	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)
Jeromy's avatar
Jeromy committed
106
107
108
109
110
	if err != nil {
		log.Fatalln(err)
	}

	pi := pstore.PeerInfo{
Jeromy's avatar
Jeromy committed
111
112
		ID:    peerid,
		Addrs: []ma.Multiaddr{tptmaddr},
Jeromy's avatar
Jeromy committed
113
114
115
116
117
118
119
120
	}

	log.Println("connecting to target")
	err = ha.Connect(context.Background(), pi)
	if err != nil {
		log.Fatalln(err)
	}

Lars Gierth's avatar
Lars Gierth committed
121
	log.Println("opening stream")
Jeromy's avatar
Jeromy committed
122
123
	// make a new stream from host B to host A
	// it should be handled on host A by the handler we set
Lars Gierth's avatar
Lars Gierth committed
124
	s, err := ha.NewStream(context.Background(), peerid, "/echo/1.0.0")
Jeromy's avatar
Jeromy committed
125
126
127
128
	if err != nil {
		log.Fatalln(err)
	}

Lars Gierth's avatar
Lars Gierth committed
129
	_, err = s.Write([]byte("Hello, world!"))
Jeromy's avatar
Jeromy committed
130
131
132
133
	if err != nil {
		log.Fatalln(err)
	}

Jeromy's avatar
Jeromy committed
134
135
136
137
138
	out, err := ioutil.ReadAll(s)
	if err != nil {
		log.Fatalln(err)
	}

Lars Gierth's avatar
Lars Gierth committed
139
	log.Printf("read reply: %q\n", out)
Jeromy's avatar
Jeromy committed
140
}
Jeromy's avatar
Jeromy committed
141
142
143

func doEcho(s inet.Stream) {
	buf := make([]byte, 1024)
Lars Gierth's avatar
Lars Gierth committed
144
145
146
147
148
	n, err := s.Read(buf)
	if err != nil {
		log.Println(err)
		return
	}
Jeromy's avatar
Jeromy committed
149

Lars Gierth's avatar
Lars Gierth committed
150
151
152
153
154
	log.Printf("read request: %q\n", buf[:n])
	_, err = s.Write(buf[:n])
	if err != nil {
		log.Println(err)
		return
Jeromy's avatar
Jeromy committed
155
156
	}
}