This commit is contained in:
esrrhs 2018-12-18 16:56:40 +08:00
parent 6a48e91db4
commit 1fcc681090
2 changed files with 21 additions and 8 deletions

View File

@ -51,6 +51,7 @@ type ClientConn struct {
ipaddr *net.UDPAddr ipaddr *net.UDPAddr
id string id string
activeTime time.Time activeTime time.Time
close bool
} }
func (p *Client) Addr() string { func (p *Client) Addr() string {
@ -137,7 +138,7 @@ func (p *Client) Accept() error {
clientConn := p.localAddrToConnMap[srcaddr.String()] clientConn := p.localAddrToConnMap[srcaddr.String()]
if clientConn == nil { if clientConn == nil {
uuid := UniqueId() uuid := UniqueId()
clientConn = &ClientConn{ipaddr: srcaddr, id: uuid, activeTime: now} clientConn = &ClientConn{ipaddr: srcaddr, id: uuid, activeTime: now, close: false}
p.localAddrToConnMap[srcaddr.String()] = clientConn p.localAddrToConnMap[srcaddr.String()] = clientConn
p.localIdToConnMap[uuid] = clientConn p.localIdToConnMap[uuid] = clientConn
fmt.Printf("client accept new local %s %s\n", uuid, srcaddr.String()) fmt.Printf("client accept new local %s %s\n", uuid, srcaddr.String())
@ -166,7 +167,7 @@ func (p *Client) processPacket(packet *Packet) {
_, err := p.listenConn.WriteToUDP(packet.data, addr) _, err := p.listenConn.WriteToUDP(packet.data, addr)
if err != nil { if err != nil {
fmt.Printf("WriteToUDP Error read udp %s\n", err) fmt.Printf("WriteToUDP Error read udp %s\n", err)
p.Close(clientConn) clientConn.close = true
return return
} }
} }
@ -180,9 +181,15 @@ func (p *Client) Close(clientConn *ClientConn) {
func (p *Client) checkTimeoutConn() { func (p *Client) checkTimeoutConn() {
now := time.Now() now := time.Now()
for id, conn := range p.localIdToConnMap { for _, conn := range p.localIdToConnMap {
diff := now.Sub(conn.activeTime) diff := now.Sub(conn.activeTime)
if diff > time.Second*(time.Duration(p.timeout)) { if diff > time.Second*(time.Duration(p.timeout)) {
conn.close = true
}
}
for id, conn := range p.localIdToConnMap {
if conn.close {
fmt.Printf("close inactive conn %s %s\n", id, conn.ipaddr.String()) fmt.Printf("close inactive conn %s %s\n", id, conn.ipaddr.String())
p.Close(conn) p.Close(conn)
} }

View File

@ -26,6 +26,7 @@ type ServerConn struct {
conn *net.UDPConn conn *net.UDPConn
id string id string
activeTime time.Time activeTime time.Time
close bool
} }
func (p *Server) Run() { func (p *Server) Run() {
@ -77,7 +78,7 @@ func (p *Server) processPacket(packet *Packet) {
fmt.Printf("Error listening for udp packets: %s\n", err.Error()) fmt.Printf("Error listening for udp packets: %s\n", err.Error())
return return
} }
udpConn = &ServerConn{conn: targetConn, ipaddrTarget: ipaddrTarget, id: id, activeTime: now} udpConn = &ServerConn{conn: targetConn, ipaddrTarget: ipaddrTarget, id: id, activeTime: now, close: false}
p.localConnMap[id] = udpConn p.localConnMap[id] = udpConn
go p.Recv(udpConn, id, packet.src) go p.Recv(udpConn, id, packet.src)
} }
@ -87,7 +88,7 @@ func (p *Server) processPacket(packet *Packet) {
_, err := udpConn.conn.Write(packet.data) _, err := udpConn.conn.Write(packet.data)
if err != nil { if err != nil {
fmt.Printf("WriteToUDP Error %s\n", err) fmt.Printf("WriteToUDP Error %s\n", err)
p.Close(udpConn) udpConn.close = true
return return
} }
} }
@ -108,7 +109,7 @@ func (p *Server) Recv(conn *ServerConn, id string, src *net.IPAddr) {
continue continue
} else { } else {
fmt.Printf("ReadFromUDP Error read udp %s\n", err) fmt.Printf("ReadFromUDP Error read udp %s\n", err)
p.Close(conn) conn.close = true
return return
} }
} }
@ -131,12 +132,17 @@ func (p *Server) Close(conn *ServerConn) {
func (p *Server) checkTimeoutConn() { func (p *Server) checkTimeoutConn() {
now := time.Now() now := time.Now()
for id, conn := range p.localConnMap { for _, conn := range p.localConnMap {
diff := now.Sub(conn.activeTime) diff := now.Sub(conn.activeTime)
if diff > time.Second*(time.Duration(p.timeout)) { if diff > time.Second*(time.Duration(p.timeout)) {
conn.close = true
}
}
for id, conn := range p.localConnMap {
if conn.close {
fmt.Printf("close inactive conn %s %s\n", id, conn.ipaddrTarget.String()) fmt.Printf("close inactive conn %s %s\n", id, conn.ipaddrTarget.String())
p.Close(conn) p.Close(conn)
} }
} }
} }