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  }