github.com/zignig/go-ipfs@v0.0.0-20141111235910-c9e5fdf55a52/net/conn/dial.go (about) 1 package conn 2 3 import ( 4 "fmt" 5 6 context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" 7 8 manet "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr/net" 9 10 peer "github.com/jbenet/go-ipfs/peer" 11 ) 12 13 // Dial connects to a particular peer, over a given network 14 // Example: d.Dial(ctx, "udp", peer) 15 func (d *Dialer) Dial(ctx context.Context, network string, remote peer.Peer) (Conn, error) { 16 laddr := d.LocalPeer.NetAddress(network) 17 if laddr == nil { 18 return nil, fmt.Errorf("No local address for network %s", network) 19 } 20 21 raddr := remote.NetAddress(network) 22 if raddr == nil { 23 return nil, fmt.Errorf("No remote address for network %s", network) 24 } 25 26 remote, err := d.Peerstore.Add(remote) 27 if err != nil { 28 log.Errorf("Error putting peer into peerstore: %s", remote) 29 } 30 31 // TODO: try to get reusing addr/ports to work. 32 // madialer := manet.Dialer{LocalAddr: laddr} 33 madialer := manet.Dialer{} 34 35 log.Infof("%s dialing %s %s", d.LocalPeer, remote, raddr) 36 maconn, err := madialer.Dial(raddr) 37 if err != nil { 38 return nil, err 39 } 40 41 c, err := newSingleConn(ctx, d.LocalPeer, remote, maconn) 42 if err != nil { 43 return nil, err 44 } 45 46 return newSecureConn(ctx, c, d.Peerstore) 47 }