// Handle getting ID from this peer and adding it into the map func (s *Swarm) handleNewConn(nconn net.Conn) { p := new(peer.Peer) conn := &Conn{ Peer: p, Addr: nil, Conn: nconn, } newConnChans(conn) sin, sout, err := ident.Handshake(s.local, p, conn.Incoming.MsgChan, conn.Outgoing.MsgChan) if err != nil { u.PErr("%v\n", err.Error()) conn.Close() return } // Get address to contact remote peer from addr := <-sin maddr, err := ma.NewMultiaddr(string(addr)) if err != nil { u.PErr("Got invalid address from peer.") s.Error(err) return } p.AddAddress(maddr) conn.secIn = sin conn.secOut = sout err = s.StartConn(conn) if err != nil { s.Error(err) } }
// Handle performing a handshake on a new connection and ensuring proper forward communication func (s *Swarm) handleDialedCon(conn *Conn) error { sin, sout, err := ident.Handshake(s.local, conn.Peer, conn.Incoming.MsgChan, conn.Outgoing.MsgChan) if err != nil { return err } // Send node an address that you can be reached on myaddr := s.local.NetAddress("tcp") mastr, err := myaddr.String() if err != nil { return errors.New("No local address to send to peer.") } sout <- []byte(mastr) conn.secIn = sin conn.secOut = sout s.StartConn(conn) return nil }