// Fetch a given number of best (most recenty seen) peers. func GetBestPeers(limit uint, isConnected func(*PeerAddr) bool) (res manyPeers) { if proxyPeer != nil { if isConnected == nil || !isConnected(proxyPeer) { return manyPeers{proxyPeer} } return manyPeers{} } peerdb_mutex.Lock() tmp := make(manyPeers, 0) PeerDB.Browse(func(k qdb.KeyType, v []byte) uint32 { ad := NewPeer(v) if ad.Banned == 0 && sys.ValidIp4(ad.Ip4[:]) && !sys.IsIPBlocked(ad.Ip4[:]) { if isConnected == nil || !isConnected(ad) { tmp = append(tmp, ad) } } return 0 }) peerdb_mutex.Unlock() // Copy the top rows to the result buffer if len(tmp) > 0 { sort.Sort(tmp) if uint(len(tmp)) < limit { limit = uint(len(tmp)) } res = make(manyPeers, limit) copy(res, tmp[:limit]) } return }
func NewPeerFromString(ipstr string, force_default_port bool) (p *PeerAddr, e error) { port := DefaultTcpPort() x := strings.Index(ipstr, ":") if x != -1 { if !force_default_port { v, er := strconv.ParseUint(ipstr[x+1:], 10, 32) if er != nil { e = er return } if v > 0xffff { e = errors.New("Port number too big") return } port = uint16(v) } ipstr = ipstr[:x] // remove port number } ip := net.ParseIP(ipstr) if ip != nil && len(ip) == 16 { if sys.IsIPBlocked(ip[12:16]) { e = errors.New(ipstr + " is blocked") return } p = NewEmptyPeer() copy(p.Ip4[:], ip[12:16]) p.Services = Services copy(p.Ip6[:], ip[:12]) p.Port = port if dbp := PeerDB.Get(qdb.KeyType(p.UniqID())); dbp != nil && NewPeer(dbp).Banned != 0 { e = errors.New(p.Ip() + " is banned") p = nil } else { p.Time = uint32(time.Now().Unix()) p.Save() } } else { e = errors.New("Error parsing IP '" + ipstr + "'") } return }