This commit is contained in:
esrrhs 2019-10-30 19:28:00 +08:00
parent a43e5c435f
commit a4573f1540
2 changed files with 32 additions and 21 deletions

View File

@ -65,8 +65,9 @@ func NewClient(addr string, server string, target string, timeout int, key int,
} }
type Client struct { type Client struct {
exit bool exit bool
rtt time.Duration rtt time.Duration
interval *time.Ticker
id int id int
sequence int sequence int
@ -147,7 +148,6 @@ func (p *Client) Run() error {
loggo.Error("Error listening for ICMP packets: %s", err.Error()) loggo.Error("Error listening for ICMP packets: %s", err.Error())
return err return err
} }
defer conn.Close()
p.conn = conn p.conn = conn
if p.tcpmode > 0 { if p.tcpmode > 0 {
@ -156,7 +156,6 @@ func (p *Client) Run() error {
loggo.Error("Error listening for tcp packets: %s", err.Error()) loggo.Error("Error listening for tcp packets: %s", err.Error())
return err return err
} }
defer tcplistenConn.Close()
p.tcplistenConn = tcplistenConn p.tcplistenConn = tcplistenConn
} else { } else {
listener, err := net.ListenUDP("udp", p.ipaddr) listener, err := net.ListenUDP("udp", p.ipaddr)
@ -164,7 +163,6 @@ func (p *Client) Run() error {
loggo.Error("Error listening for udp packets: %s", err.Error()) loggo.Error("Error listening for udp packets: %s", err.Error())
return err return err
} }
defer listener.Close()
p.listenConn = listener p.listenConn = listener
} }
@ -180,13 +178,12 @@ func (p *Client) Run() error {
recv := make(chan *Packet, 10000) recv := make(chan *Packet, 10000)
go recvICMP(*p.conn, recv) go recvICMP(*p.conn, recv)
interval := time.NewTicker(time.Second) p.interval = time.NewTicker(time.Second)
defer interval.Stop()
go func() { go func() {
for !p.exit { for !p.exit {
select { select {
case <-interval.C: case <-p.interval.C:
p.checkTimeoutConn() p.checkTimeoutConn()
p.ping() p.ping()
p.showNet() p.showNet()
@ -201,6 +198,14 @@ func (p *Client) Run() error {
func (p *Client) Stop() { func (p *Client) Stop() {
p.exit = true p.exit = true
p.conn.Close()
if p.tcplistenConn != nil {
p.tcplistenConn.Close()
}
if p.listenConn != nil {
p.listenConn.Close()
}
p.interval.Stop()
} }
func (p *Client) AcceptTcp() error { func (p *Client) AcceptTcp() error {
@ -269,7 +274,7 @@ func (p *Client) AcceptTcpConn(conn *net.TCPConn, targetAddr string) {
diffclose := now.Sub(startConnectTime) diffclose := now.Sub(startConnectTime)
if diffclose > time.Second*(time.Duration(p.timeout)) { if diffclose > time.Second*(time.Duration(p.timeout)) {
loggo.Info("can not connect remote tcp %s %s", uuid, tcpsrcaddr.String()) loggo.Info("can not connect remote tcp %s %s", uuid, tcpsrcaddr.String())
p.Close(clientConn) p.close(clientConn)
return return
} }
} }
@ -416,7 +421,7 @@ func (p *Client) AcceptTcpConn(conn *net.TCPConn, targetAddr string) {
loggo.Info("close tcp conn %s %s", clientConn.id, clientConn.tcpaddr.String()) loggo.Info("close tcp conn %s %s", clientConn.id, clientConn.tcpaddr.String())
conn.Close() conn.Close()
p.Close(clientConn) p.close(clientConn)
} }
func (p *Client) Accept() error { func (p *Client) Accept() error {
@ -521,7 +526,7 @@ func (p *Client) processPacket(packet *Packet) {
p.recvPacketSize += (uint64)(len(packet.my.Data)) p.recvPacketSize += (uint64)(len(packet.my.Data))
} }
func (p *Client) Close(clientConn *ClientConn) { func (p *Client) close(clientConn *ClientConn) {
if p.localIdToConnMap[clientConn.id] != nil { if p.localIdToConnMap[clientConn.id] != nil {
delete(p.localIdToConnMap, clientConn.id) delete(p.localIdToConnMap, clientConn.id)
delete(p.localAddrToConnMap, clientConn.ipaddr.String()) delete(p.localAddrToConnMap, clientConn.ipaddr.String())
@ -546,7 +551,7 @@ func (p *Client) checkTimeoutConn() {
for id, conn := range p.localIdToConnMap { for id, conn := range p.localIdToConnMap {
if conn.close { if conn.close {
loggo.Info("close inactive conn %s %s", id, conn.ipaddr.String()) loggo.Info("close inactive conn %s %s", id, conn.ipaddr.String())
p.Close(conn) p.close(conn)
} }
} }
} }

View File

@ -17,8 +17,9 @@ func NewServer(key int) (*Server, error) {
} }
type Server struct { type Server struct {
exit bool exit bool
key int key int
interval *time.Ticker
conn *icmp.PacketConn conn *icmp.PacketConn
@ -62,13 +63,12 @@ func (p *Server) Run() error {
recv := make(chan *Packet, 10000) recv := make(chan *Packet, 10000)
go recvICMP(*p.conn, recv) go recvICMP(*p.conn, recv)
interval := time.NewTicker(time.Second) p.interval = time.NewTicker(time.Second)
defer interval.Stop()
go func() { go func() {
for !p.exit { for !p.exit {
select { select {
case <-interval.C: case <-p.interval.C:
p.checkTimeoutConn() p.checkTimeoutConn()
p.showNet() p.showNet()
case r := <-recv: case r := <-recv:
@ -80,6 +80,12 @@ func (p *Server) Run() error {
return nil return nil
} }
func (p *Server) Stop() {
p.exit = true
p.conn.Close()
p.interval.Stop()
}
func (p *Server) processPacket(packet *Packet) { func (p *Server) processPacket(packet *Packet) {
if packet.my.Key != (int32)(p.key) { if packet.my.Key != (int32)(p.key) {
@ -212,7 +218,7 @@ func (p *Server) RecvTCP(conn *ServerConn, id string, src *net.IPAddr) {
diffclose := now.Sub(startConnectTime) diffclose := now.Sub(startConnectTime)
if diffclose > time.Second*(time.Duration(conn.timeout)) { if diffclose > time.Second*(time.Duration(conn.timeout)) {
loggo.Info("can not connect remote tcp %s %s", conn.id, conn.tcpaddrTarget.String()) loggo.Info("can not connect remote tcp %s %s", conn.id, conn.tcpaddrTarget.String())
p.Close(conn) p.close(conn)
return return
} }
} }
@ -359,7 +365,7 @@ func (p *Server) RecvTCP(conn *ServerConn, id string, src *net.IPAddr) {
time.Sleep(time.Second) time.Sleep(time.Second)
loggo.Info("close tcp conn %s %s", conn.id, conn.tcpaddrTarget.String()) loggo.Info("close tcp conn %s %s", conn.id, conn.tcpaddrTarget.String())
p.Close(conn) p.close(conn)
} }
func (p *Server) Recv(conn *ServerConn, id string, src *net.IPAddr) { func (p *Server) Recv(conn *ServerConn, id string, src *net.IPAddr) {
@ -393,7 +399,7 @@ func (p *Server) Recv(conn *ServerConn, id string, src *net.IPAddr) {
} }
} }
func (p *Server) Close(conn *ServerConn) { func (p *Server) close(conn *ServerConn) {
if p.localConnMap[conn.id] != nil { if p.localConnMap[conn.id] != nil {
if conn.conn != nil { if conn.conn != nil {
conn.conn.Close() conn.conn.Close()
@ -425,7 +431,7 @@ func (p *Server) checkTimeoutConn() {
} }
if conn.close { if conn.close {
loggo.Info("close inactive conn %s %s", id, conn.ipaddrTarget.String()) loggo.Info("close inactive conn %s %s", id, conn.ipaddrTarget.String())
p.Close(conn) p.close(conn)
} }
} }
} }