This commit is contained in:
esrrhs 2019-10-31 21:48:32 +08:00
parent 2a75a80a0e
commit 0ba2aa2297
4 changed files with 65 additions and 39 deletions

View File

@ -113,6 +113,7 @@ type Client struct {
} }
type ClientConn struct { type ClientConn struct {
exit bool
ipaddr *net.UDPAddr ipaddr *net.UDPAddr
tcpaddr *net.TCPAddr tcpaddr *net.TCPAddr
id string id string
@ -286,7 +287,7 @@ func (p *Client) AcceptTcpConn(conn *net.TCPConn, targetAddr string) {
fm := NewFrameMgr(p.tcpmode_buffersize, p.tcpmode_maxwin, p.tcpmode_resend_timems, p.tcpmode_compress, p.tcpmode_stat) fm := NewFrameMgr(p.tcpmode_buffersize, p.tcpmode_maxwin, p.tcpmode_resend_timems, p.tcpmode_compress, p.tcpmode_stat)
now := time.Now() now := time.Now()
clientConn := &ClientConn{tcpaddr: tcpsrcaddr, id: uuid, activeRecvTime: now, activeSendTime: now, close: false, clientConn := &ClientConn{exit: false, tcpaddr: tcpsrcaddr, id: uuid, activeRecvTime: now, activeSendTime: now, close: false,
fm: fm} fm: fm}
p.addClientConn(uuid, tcpsrcaddr.String(), clientConn) p.addClientConn(uuid, tcpsrcaddr.String(), clientConn)
loggo.Info("client accept new local tcp %s %s", uuid, tcpsrcaddr.String()) loggo.Info("client accept new local tcp %s %s", uuid, tcpsrcaddr.String())
@ -294,7 +295,7 @@ func (p *Client) AcceptTcpConn(conn *net.TCPConn, targetAddr string) {
loggo.Info("start connect remote tcp %s %s", uuid, tcpsrcaddr.String()) loggo.Info("start connect remote tcp %s %s", uuid, tcpsrcaddr.String())
clientConn.fm.Connect() clientConn.fm.Connect()
startConnectTime := time.Now() startConnectTime := time.Now()
for !p.exit { for !p.exit && !clientConn.exit {
if clientConn.fm.IsConnected() { if clientConn.fm.IsConnected() {
break break
} }
@ -327,7 +328,7 @@ func (p *Client) AcceptTcpConn(conn *net.TCPConn, targetAddr string) {
tcpActiveRecvTime := time.Now() tcpActiveRecvTime := time.Now()
tcpActiveSendTime := time.Now() tcpActiveSendTime := time.Now()
for !p.exit { for !p.exit && !clientConn.exit {
now := time.Now() now := time.Now()
sleep := true sleep := true
@ -415,7 +416,7 @@ func (p *Client) AcceptTcpConn(conn *net.TCPConn, targetAddr string) {
} }
startCloseTime := time.Now() startCloseTime := time.Now()
for !p.exit { for !p.exit && !clientConn.exit {
now := time.Now() now := time.Now()
clientConn.fm.Update() clientConn.fm.Update()
@ -497,7 +498,7 @@ func (p *Client) Accept() error {
continue continue
} }
uuid := UniqueId() uuid := UniqueId()
clientConn = &ClientConn{ipaddr: srcaddr, id: uuid, activeRecvTime: now, activeSendTime: now, close: false} clientConn = &ClientConn{exit: false, ipaddr: srcaddr, id: uuid, activeRecvTime: now, activeSendTime: now, close: false}
p.addClientConn(uuid, srcaddr.String(), clientConn) p.addClientConn(uuid, srcaddr.String(), clientConn)
loggo.Info("client accept new local udp %s %s", uuid, srcaddr.String()) loggo.Info("client accept new local udp %s %s", uuid, srcaddr.String())
} }
@ -539,6 +540,15 @@ func (p *Client) processPacket(packet *Packet) {
return return
} }
if packet.my.Type == (int32)(MyMsg_KICK) {
clientConn := p.getClientConnById(packet.my.Id)
if clientConn != nil {
p.close(clientConn)
loggo.Info("remote kick local %s", packet.my.Id)
}
return
}
loggo.Debug("processPacket %s %s %d", packet.my.Id, packet.src.String(), len(packet.my.Data)) loggo.Debug("processPacket %s %s %d", packet.my.Id, packet.src.String(), len(packet.my.Data))
clientConn := p.getClientConnById(packet.my.Id) clientConn := p.getClientConnById(packet.my.Id)
@ -574,6 +584,7 @@ func (p *Client) processPacket(packet *Packet) {
} }
func (p *Client) close(clientConn *ClientConn) { func (p *Client) close(clientConn *ClientConn) {
clientConn.exit = true
p.deleteClientConn(clientConn.id, clientConn.ipaddr.String()) p.deleteClientConn(clientConn.id, clientConn.ipaddr.String())
p.deleteClientConn(clientConn.id, clientConn.tcpaddr.String()) p.deleteClientConn(clientConn.id, clientConn.tcpaddr.String())
} }

View File

@ -25,18 +25,21 @@ type MyMsg_TYPE int32
const ( const (
MyMsg_DATA MyMsg_TYPE = 0 MyMsg_DATA MyMsg_TYPE = 0
MyMsg_PING MyMsg_TYPE = 1 MyMsg_PING MyMsg_TYPE = 1
MyMsg_KICK MyMsg_TYPE = 2
MyMsg_MAGIC MyMsg_TYPE = 57005 MyMsg_MAGIC MyMsg_TYPE = 57005
) )
var MyMsg_TYPE_name = map[int32]string{ var MyMsg_TYPE_name = map[int32]string{
0: "DATA", 0: "DATA",
1: "PING", 1: "PING",
2: "KICK",
57005: "MAGIC", 57005: "MAGIC",
} }
var MyMsg_TYPE_value = map[string]int32{ var MyMsg_TYPE_value = map[string]int32{
"DATA": 0, "DATA": 0,
"PING": 1, "PING": 1,
"KICK": 2,
"MAGIC": 57005, "MAGIC": 57005,
} }
@ -402,36 +405,37 @@ func init() {
func init() { proto.RegisterFile("msg.proto", fileDescriptor_c06e4cca6c2cc899) } func init() { proto.RegisterFile("msg.proto", fileDescriptor_c06e4cca6c2cc899) }
var fileDescriptor_c06e4cca6c2cc899 = []byte{ var fileDescriptor_c06e4cca6c2cc899 = []byte{
// 493 bytes of a gzipped FileDescriptorProto // 499 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x52, 0xcb, 0x6e, 0xd3, 0x40, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x52, 0xcb, 0x6e, 0xd3, 0x4c,
0x14, 0x65, 0xfc, 0x48, 0xe2, 0x9b, 0x34, 0x4c, 0x87, 0x87, 0x46, 0x2c, 0x90, 0xb1, 0x84, 0x30, 0x14, 0xfe, 0xc7, 0x97, 0x24, 0x3e, 0xb9, 0xfc, 0xd3, 0xe1, 0xa2, 0x11, 0x0b, 0x14, 0x2c, 0x21,
0x0b, 0xba, 0x28, 0x12, 0xac, 0x53, 0x37, 0x44, 0x15, 0xe4, 0xc1, 0x24, 0x2c, 0x60, 0x13, 0xb9, 0x99, 0x05, 0x95, 0x28, 0x12, 0xac, 0x53, 0x37, 0x44, 0x51, 0xc9, 0x85, 0x49, 0x58, 0xc0, 0x26,
0xf1, 0xd4, 0xb2, 0xc0, 0x0f, 0xd9, 0x13, 0x41, 0xf8, 0x02, 0x7e, 0x86, 0x4f, 0xe0, 0x0f, 0x90, 0x72, 0xe3, 0xa9, 0x65, 0x81, 0x2f, 0xb2, 0x27, 0x82, 0xf0, 0x04, 0xbc, 0x0c, 0x8f, 0xc0, 0x33,
0xf8, 0x25, 0x34, 0xb7, 0x63, 0xb7, 0x12, 0xac, 0x7c, 0xce, 0x3d, 0x27, 0xb9, 0x67, 0xee, 0xbd, 0xb0, 0xe3, 0x79, 0xd0, 0x9c, 0x8e, 0xdd, 0x4a, 0xb0, 0xf2, 0x77, 0x4b, 0xfc, 0xf9, 0x9c, 0x03,
0xe0, 0xe5, 0x4d, 0x7a, 0x52, 0xd5, 0xa5, 0x2a, 0x83, 0xdf, 0x36, 0xb8, 0xf3, 0xc3, 0xbc, 0x49, 0x5e, 0x56, 0x27, 0xa7, 0x65, 0x55, 0xa8, 0xc2, 0xff, 0x6d, 0x83, 0xbb, 0x38, 0x2e, 0xea, 0x84,
0xd9, 0x18, 0xac, 0x2c, 0xe1, 0xc4, 0x27, 0xa1, 0x27, 0xac, 0x2c, 0x61, 0x0c, 0x1c, 0x75, 0xa8, 0x8d, 0xc0, 0x4a, 0x63, 0x4e, 0xc6, 0x24, 0xf0, 0x84, 0x95, 0xc6, 0x8c, 0x81, 0xa3, 0x8e, 0xa5,
0x24, 0xb7, 0x7c, 0x12, 0xba, 0x02, 0x31, 0x7b, 0x08, 0x3d, 0x15, 0xd7, 0xa9, 0x54, 0xdc, 0x46, 0xe4, 0xd6, 0x98, 0x04, 0xae, 0x40, 0xcc, 0x1e, 0x42, 0x47, 0x45, 0x55, 0x22, 0x15, 0xb7, 0x31,
0x9f, 0x61, 0xda, 0x9b, 0xc4, 0x2a, 0xe6, 0x8e, 0x4f, 0xc2, 0x91, 0x40, 0xac, 0xbd, 0x35, 0xf6, 0x67, 0x98, 0xce, 0xc6, 0x91, 0x8a, 0xb8, 0x33, 0x26, 0xc1, 0x40, 0x20, 0xd6, 0xd9, 0x0a, 0xdf,
0xe0, 0xae, 0x4f, 0xc2, 0x63, 0x61, 0x18, 0xbb, 0x0f, 0x6e, 0x1e, 0xa7, 0xd9, 0x8e, 0xf7, 0xb0, 0xc1, 0xdd, 0x31, 0x09, 0x4e, 0x84, 0x61, 0xec, 0x3e, 0xb8, 0x59, 0x94, 0xa4, 0x7b, 0xde, 0x41,
0x7c, 0x4d, 0x18, 0x05, 0xfb, 0xb3, 0x3c, 0xf0, 0x3e, 0xd6, 0x34, 0x64, 0x1c, 0xfa, 0x2a, 0xcb, 0xf9, 0x86, 0x30, 0x0a, 0xf6, 0x27, 0x79, 0xe4, 0x5d, 0xd4, 0x34, 0x64, 0x1c, 0xba, 0x2a, 0xcd,
0x65, 0xb9, 0x57, 0x7c, 0x80, 0x11, 0x5a, 0x8a, 0xca, 0xae, 0xca, 0xcb, 0x44, 0x72, 0xcf, 0x28, 0x64, 0x71, 0x50, 0xbc, 0x87, 0x15, 0x1a, 0x8a, 0xce, 0xbe, 0xcc, 0x8a, 0x58, 0x72, 0xcf, 0x38,
0xd7, 0x94, 0xbd, 0x00, 0x66, 0xe0, 0xf6, 0x72, 0x7f, 0x75, 0x25, 0xeb, 0x26, 0xfb, 0x2e, 0x39, 0x37, 0x94, 0x3d, 0x07, 0x66, 0xe0, 0xee, 0xea, 0x70, 0x7d, 0x2d, 0xab, 0x3a, 0xfd, 0x26, 0x39,
0xa0, 0xe9, 0xd8, 0x28, 0x67, 0x9d, 0xc0, 0x9e, 0xc2, 0xb8, 0xb5, 0xe7, 0xf1, 0xb7, 0xaf, 0x59, 0x60, 0xe8, 0xc4, 0x38, 0xe7, 0xad, 0xc1, 0x9e, 0xc2, 0xa8, 0x89, 0x67, 0xd1, 0xd7, 0x2f, 0x69,
0xc1, 0x87, 0x68, 0x3d, 0x32, 0xd5, 0x39, 0x16, 0xd9, 0x29, 0x3c, 0x68, 0x6d, 0xb5, 0x6c, 0x64, 0xce, 0xfb, 0x18, 0x1d, 0x1a, 0x75, 0x81, 0x22, 0x3b, 0x83, 0x07, 0x4d, 0xac, 0x92, 0xb5, 0xcc,
0x91, 0x6c, 0x75, 0x92, 0xbc, 0xe1, 0x23, 0x74, 0xdf, 0x33, 0xa2, 0x40, 0x6d, 0x83, 0x12, 0x7b, 0xe3, 0x9d, 0x6e, 0x92, 0xd5, 0x7c, 0x80, 0xe9, 0x7b, 0xc6, 0x14, 0xe8, 0x6d, 0xd1, 0x62, 0xcf,
0x0e, 0xb4, 0xfd, 0xcd, 0xae, 0xcc, 0xab, 0x5a, 0x36, 0x0d, 0x3f, 0x42, 0xfb, 0x5d, 0x53, 0x8f, 0x80, 0x36, 0xbf, 0xd9, 0x17, 0x59, 0x59, 0xc9, 0xba, 0xe6, 0x43, 0x8c, 0xff, 0x6f, 0xf4, 0xd0,
0x4c, 0x99, 0x3d, 0x81, 0x51, 0x6b, 0x6d, 0x54, 0xac, 0xf8, 0x18, 0x6d, 0x43, 0x53, 0x5b, 0xab, 0xc8, 0xec, 0x09, 0x0c, 0x9a, 0x68, 0xad, 0x22, 0xc5, 0x47, 0x18, 0xeb, 0x1b, 0x6d, 0xa3, 0x22,
0x58, 0x05, 0xcf, 0xc0, 0xd9, 0x7c, 0x5c, 0x4d, 0xd9, 0x00, 0x9c, 0xf3, 0xc9, 0x66, 0x42, 0xef, 0xe5, 0xbf, 0x00, 0x67, 0xfb, 0x61, 0x3d, 0x65, 0x3d, 0x70, 0x2e, 0x26, 0xdb, 0x09, 0xfd, 0x4f,
0x68, 0xb4, 0xba, 0x58, 0xcc, 0x28, 0x61, 0x43, 0x70, 0xe7, 0x93, 0xd9, 0x45, 0x44, 0x7f, 0xfe, 0xa3, 0xf5, 0x7c, 0x39, 0xa3, 0x44, 0xa3, 0xcb, 0x79, 0x78, 0x49, 0x2d, 0xd6, 0x07, 0x77, 0x31,
0xb2, 0x83, 0x1f, 0x04, 0xbc, 0x37, 0x75, 0x9c, 0xcb, 0x73, 0xbd, 0x82, 0x76, 0x85, 0xe4, 0xd6, 0x99, 0xcd, 0x43, 0xfa, 0xe3, 0xa7, 0xed, 0x7f, 0x27, 0xe0, 0xbd, 0xa9, 0xa2, 0x4c, 0x5e, 0xe8,
0x0a, 0xdb, 0x55, 0x59, 0xb7, 0x56, 0xf5, 0x08, 0x06, 0x5d, 0x48, 0xbd, 0xd8, 0x81, 0xe8, 0x78, 0x65, 0x34, 0xcb, 0x24, 0x77, 0x96, 0xd9, 0x2c, 0xcd, 0xba, 0xb3, 0xb4, 0x47, 0xd0, 0x6b, 0xeb,
0xf0, 0xda, 0xb4, 0x3e, 0x02, 0xef, 0xc3, 0x7a, 0x2a, 0xb6, 0x37, 0xfd, 0xa3, 0xe5, 0x62, 0x81, 0xea, 0x15, 0xf7, 0x44, 0xcb, 0xfd, 0xd7, 0xa6, 0xc4, 0x10, 0xbc, 0xf7, 0x9b, 0xa9, 0xd8, 0xdd,
0xfd, 0xfb, 0x1a, 0x89, 0xf5, 0x8a, 0x5a, 0xcc, 0x03, 0x37, 0x7a, 0xb7, 0x5c, 0x4f, 0xa9, 0x1d, 0x36, 0x09, 0x57, 0xcb, 0x25, 0x25, 0xac, 0x0f, 0x5d, 0x8d, 0xc4, 0x66, 0x4d, 0x2d, 0xe6, 0x81,
0xfc, 0x21, 0xe0, 0x62, 0x94, 0xff, 0xc6, 0xd0, 0xd7, 0x81, 0xf3, 0xc2, 0x20, 0x03, 0x61, 0x98, 0x1b, 0xbe, 0x5d, 0x6d, 0xa6, 0xd4, 0xf6, 0x7f, 0x11, 0x70, 0xb1, 0xca, 0x3f, 0x6b, 0xe8, 0x3b,
0x8e, 0xa2, 0xbf, 0x7a, 0xc0, 0x18, 0xc5, 0x16, 0x1d, 0x37, 0x17, 0xea, 0xe0, 0xbf, 0xe8, 0x0b, 0xc1, 0xc9, 0x61, 0x91, 0x9e, 0x30, 0x4c, 0x57, 0xd1, 0x4f, 0x3d, 0x6a, 0xac, 0x62, 0x8b, 0x96,
0x7d, 0x6c, 0x9e, 0xa2, 0xef, 0x6b, 0x78, 0x0a, 0x27, 0xdd, 0xc3, 0x6f, 0x2e, 0x50, 0x7f, 0xb3, 0x9b, 0x5b, 0x75, 0xf0, 0x5f, 0xf4, 0xad, 0x3e, 0x36, 0x9f, 0xa2, 0x2f, 0xad, 0x7f, 0x06, 0xa7,
0x84, 0xf7, 0x7c, 0x3b, 0x74, 0x85, 0x61, 0xc1, 0xab, 0x7f, 0xa6, 0xd9, 0x07, 0x5b, 0x4c, 0xdf, 0xed, 0x87, 0xdf, 0xde, 0xa2, 0x7e, 0xa6, 0x31, 0xef, 0x8c, 0xed, 0xc0, 0x15, 0x86, 0xf9, 0xaf,
0x53, 0xa2, 0xc1, 0x24, 0x7a, 0x4b, 0xad, 0x6e, 0xbe, 0x36, 0xa2, 0xe5, 0x62, 0x46, 0x9d, 0xb3, 0xfe, 0x9a, 0x6b, 0x17, 0x6c, 0x31, 0x7d, 0x47, 0x89, 0x06, 0x13, 0x9c, 0x6a, 0x33, 0x69, 0x1b,
0xd1, 0x27, 0xa8, 0xb2, 0x22, 0x55, 0xfb, 0xa2, 0x90, 0x5f, 0x2e, 0x7b, 0x78, 0xce, 0x2f, 0xff, 0xd1, 0x6a, 0x39, 0xa3, 0xce, 0xf9, 0xe0, 0x23, 0x94, 0x69, 0x9e, 0xa8, 0x43, 0x9e, 0xcb, 0xcf,
0x06, 0x00, 0x00, 0xff, 0xff, 0x5b, 0xf2, 0xbf, 0x87, 0x4d, 0x03, 0x00, 0x00, 0x57, 0x1d, 0x3c, 0xec, 0x97, 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, 0x15, 0x89, 0x25, 0x68, 0x57,
0x03, 0x00, 0x00,
} }

View File

@ -5,6 +5,7 @@ message MyMsg {
enum TYPE { enum TYPE {
DATA = 0; DATA = 0;
PING = 1; PING = 1;
KICK = 2;
MAGIC = 0xdead; MAGIC = 0xdead;
} }

View File

@ -27,7 +27,8 @@ type Server struct {
conn *icmp.PacketConn conn *icmp.PacketConn
localConnMap sync.Map localConnMap sync.Map
remoteConnErrorMap sync.Map
sendPacket uint64 sendPacket uint64
recvPacket uint64 recvPacket uint64
@ -123,6 +124,7 @@ func (p *Server) processPacket(packet *Packet) {
if p.maxconn > 0 && p.localConnMapSize >= p.maxconn { if p.maxconn > 0 && p.localConnMapSize >= p.maxconn {
loggo.Info("too many connections %d, server connected target fail %s", p.localConnMapSize, packet.my.Target) loggo.Info("too many connections %d, server connected target fail %s", p.localConnMapSize, packet.my.Target)
p.remoteError(id, packet)
return return
} }
@ -133,6 +135,7 @@ func (p *Server) processPacket(packet *Packet) {
c, err := net.DialTimeout("tcp", addr, time.Second) c, err := net.DialTimeout("tcp", addr, time.Second)
if err != nil { if err != nil {
loggo.Error("Error listening for tcp packets: %s", err.Error()) loggo.Error("Error listening for tcp packets: %s", err.Error())
p.remoteError(id, packet)
return return
} }
targetConn := c.(*net.TCPConn) targetConn := c.(*net.TCPConn)
@ -155,6 +158,7 @@ func (p *Server) processPacket(packet *Packet) {
c, err := net.DialTimeout("udp", addr, time.Second) c, err := net.DialTimeout("udp", addr, time.Second)
if err != nil { if err != nil {
loggo.Error("Error listening for tcp packets: %s", err.Error()) loggo.Error("Error listening for tcp packets: %s", err.Error())
p.remoteError(id, packet)
return return
} }
targetConn := c.(*net.UDPConn) targetConn := c.(*net.UDPConn)
@ -471,7 +475,6 @@ func (p *Server) showNet() {
} }
func (p *Server) addServerConn(uuid string, serverConn *ServerConn) { func (p *Server) addServerConn(uuid string, serverConn *ServerConn) {
p.localConnMap.Store(uuid, serverConn) p.localConnMap.Store(uuid, serverConn)
} }
@ -486,3 +489,10 @@ func (p *Server) getServerConnById(uuid string) *ServerConn {
func (p *Server) deleteServerConn(uuid string) { func (p *Server) deleteServerConn(uuid string) {
p.localConnMap.Delete(uuid) p.localConnMap.Delete(uuid)
} }
func (p *Server) remoteError(uuid string, packet *Packet) {
sendICMP(packet.echoId, packet.echoSeq, *p.conn, packet.src, "", uuid, (uint32)(MyMsg_KICK), packet.my.Data,
(int)(packet.my.Rproto), -1, p.key,
0, 0, 0, 0, 0, 0,
0)
}