Implemented proper peer checking when adding new peers

We now resolve a hostname to IP before we try to compare it to the existing peer pool
This commit is contained in:
Maran 2014-05-12 15:08:21 +02:00
parent 8b4ed8c505
commit 7f9fd08792

@ -2,6 +2,7 @@ package eth
import ( import (
"container/list" "container/list"
"fmt"
"github.com/ethereum/eth-go/ethchain" "github.com/ethereum/eth-go/ethchain"
"github.com/ethereum/eth-go/ethdb" "github.com/ethereum/eth-go/ethdb"
"github.com/ethereum/eth-go/ethrpc" "github.com/ethereum/eth-go/ethrpc"
@ -9,9 +10,11 @@ import (
"github.com/ethereum/eth-go/ethwire" "github.com/ethereum/eth-go/ethwire"
"io/ioutil" "io/ioutil"
"log" "log"
"math/rand"
"net" "net"
"net/http" "net/http"
"strconv" "strconv"
"strings"
"sync" "sync"
"sync/atomic" "sync/atomic"
"time" "time"
@ -146,15 +149,51 @@ func (s *Ethereum) ConnectToPeer(addr string) error {
if s.peers.Len() < s.MaxPeers { if s.peers.Len() < s.MaxPeers {
var alreadyConnected bool var alreadyConnected bool
ahost, _, _ := net.SplitHostPort(addr)
var chost string
ips, err := net.LookupIP(ahost)
if err != nil {
return err
} else {
// If more then one ip is available try stripping away the ipv6 ones
if len(ips) > 1 {
var ipsv4 []net.IP
// For now remove the ipv6 addresses
for _, ip := range ips {
if strings.Contains(ip.String(), "::") {
continue
} else {
ipsv4 = append(ipsv4, ip)
}
}
if len(ipsv4) == 0 {
return fmt.Errorf("[SERV] No IPV4 addresses available for hostname")
}
// Pick a random ipv4 address, simulating round-robin DNS.
rand.Seed(time.Now().UTC().UnixNano())
i := rand.Intn(len(ipsv4))
chost = ipsv4[i].String()
} else {
if len(ips) == 0 {
return fmt.Errorf("[SERV] No IPs resolved for the given hostname")
return nil
}
chost = ips[0].String()
}
}
eachPeer(s.peers, func(p *Peer, v *list.Element) { eachPeer(s.peers, func(p *Peer, v *list.Element) {
if p.conn == nil { if p.conn == nil {
return return
} }
phost, _, _ := net.SplitHostPort(p.conn.RemoteAddr().String()) phost, _, _ := net.SplitHostPort(p.conn.RemoteAddr().String())
ahost, _, _ := net.SplitHostPort(addr)
if phost == ahost { if phost == chost {
alreadyConnected = true alreadyConnected = true
ethutil.Config.Log.Debugf("[SERV] Peer %s already added.\n", chost)
return return
} }
}) })