From 0a31d10410671818376efe22d260e092a5897a77 Mon Sep 17 00:00:00 2001 From: bigeagle Date: Tue, 30 Jul 2013 20:06:55 +0800 Subject: [PATCH] ugly optimization --- hop/helpers.go | 2 +- hop/protocol.go | 50 ++++++++++++++++++++++++++++++++++--------------- hop/server.go | 4 ++-- 3 files changed, 38 insertions(+), 18 deletions(-) diff --git a/hop/helpers.go b/hop/helpers.go index 09660ba..83518f5 100644 --- a/hop/helpers.go +++ b/hop/helpers.go @@ -39,7 +39,7 @@ func ip4_uint32(ip net.IP) (i uint32) { return i } -func randAddr(a []net.Addr) net.Addr { +func randAddr(a []*hUDPAddr) *hUDPAddr { i := rand.Intn(len(a)) return a[i] } diff --git a/hop/protocol.go b/hop/protocol.go index 22b42a5..5b3546d 100644 --- a/hop/protocol.go +++ b/hop/protocol.go @@ -55,39 +55,59 @@ func unpackHopPacket(b []byte) (*HopPacket, error) { return p, nil } + +func udpAddrHash(a *net.UDPAddr) [6]byte{ + var b [6]byte + copy(b[:4], []byte(a.IP)[:4]) + p := uint16(a.Port) + b[4] = byte((p >> 8) & 0xFF) + b[5] = byte(p & 0xFF) + return b +} + +type hUDPAddr struct { + u *net.UDPAddr + hash [6]byte +} + +func newhUDPAddr(a *net.UDPAddr) *hUDPAddr { + return &hUDPAddr{a, udpAddrHash(a)} +} + // gohop Peer is a record of a peer's available UDP addrs type HopPeer struct { id uint32 - addrs map[string]int - _addrs_lst []net.Addr // i know it's ugly! + addrs map[[6]byte]int + _addrs_lst []*hUDPAddr // i know it's ugly! inited bool // whether a connection is initialized } -func newHopPeer(id uint32, addr net.Addr, idx int) *HopPeer { +func newHopPeer(id uint32, addr *net.UDPAddr, idx int) *HopPeer { hp := new(HopPeer) hp.id = id - hp._addrs_lst = make([]net.Addr, 0) - hp.addrs = make(map[string]int) + hp._addrs_lst = make([]*hUDPAddr, 0) + hp.addrs = make(map[[6]byte]int) hp.inited = false - hp._addrs_lst = append(hp._addrs_lst, addr) - hp.addrs[addr.String()] = idx + a := newhUDPAddr(addr) + hp._addrs_lst = append(hp._addrs_lst, a) + hp.addrs[a.hash] = idx return hp } -func (h *HopPeer) addr() (net.Addr, int, bool) { +func (h *HopPeer) addr() (*net.UDPAddr, int, bool) { addr := randAddr(h._addrs_lst) - idx, ok := h.addrs[addr.String()] + idx, ok := h.addrs[addr.hash] - return addr, idx, ok + return addr.u, idx, ok } -func (h *HopPeer) insertAddr(addr net.Addr, idx int) { - k := addr.String() - if _, found := h.addrs[k]; !found { - h.addrs[k] = idx - h._addrs_lst = append(h._addrs_lst, addr) +func (h *HopPeer) insertAddr(addr *net.UDPAddr, idx int) { + a := newhUDPAddr(addr) + if _, found := h.addrs[a.hash]; !found { + h.addrs[a.hash] = idx + h._addrs_lst = append(h._addrs_lst, a) //logger.Info("%v %d", addr, len(h._addrs_lst)) } } diff --git a/hop/server.go b/hop/server.go index 1e4f3df..a261072 100644 --- a/hop/server.go +++ b/hop/server.go @@ -39,7 +39,7 @@ type hopServerConfig struct { // a udpPacket type udpPacket struct { // client's addr - addr net.Addr + addr *net.UDPAddr // data data []byte // channel index @@ -211,7 +211,7 @@ func (srv *HopServer) listenAndServe(port string, idx int) { packet := new(udpPacket) packet.channel = idx buf := make([]byte, TAPBUFSIZE) - plen, packet.addr, err = udpConn.ReadFrom(buf) + plen, packet.addr, err = udpConn.ReadFromUDP(buf) packet.data = buf[:plen] if err != nil {