add
This commit is contained in:
parent
831a5ee51d
commit
64f8ec24e6
16
client.go
16
client.go
@ -19,7 +19,7 @@ const (
|
|||||||
|
|
||||||
func NewClient(addr string, server string, target string, timeout int, key int,
|
func NewClient(addr string, server string, target string, timeout int, key int,
|
||||||
tcpmode int, tcpmode_buffersize int, tcpmode_maxwin int, tcpmode_resend_timems int, tcpmode_compress int,
|
tcpmode int, tcpmode_buffersize int, tcpmode_maxwin int, tcpmode_resend_timems int, tcpmode_compress int,
|
||||||
tcpmode_stat int, open_sock5 int) (*Client, error) {
|
tcpmode_stat int, open_sock5 int, maxconn int) (*Client, error) {
|
||||||
|
|
||||||
var ipaddr *net.UDPAddr
|
var ipaddr *net.UDPAddr
|
||||||
var tcpaddr *net.TCPAddr
|
var tcpaddr *net.TCPAddr
|
||||||
@ -62,6 +62,7 @@ func NewClient(addr string, server string, target string, timeout int, key int,
|
|||||||
tcpmode_compress: tcpmode_compress,
|
tcpmode_compress: tcpmode_compress,
|
||||||
tcpmode_stat: tcpmode_stat,
|
tcpmode_stat: tcpmode_stat,
|
||||||
open_sock5: open_sock5,
|
open_sock5: open_sock5,
|
||||||
|
maxconn: maxconn,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -70,6 +71,7 @@ type Client struct {
|
|||||||
rtt time.Duration
|
rtt time.Duration
|
||||||
interval *time.Ticker
|
interval *time.Ticker
|
||||||
workResultLock sync.WaitGroup
|
workResultLock sync.WaitGroup
|
||||||
|
maxconn int
|
||||||
|
|
||||||
id int
|
id int
|
||||||
sequence int
|
sequence int
|
||||||
@ -272,9 +274,15 @@ func (p *Client) AcceptTcpConn(conn *net.TCPConn, targetAddr string) {
|
|||||||
p.workResultLock.Add(1)
|
p.workResultLock.Add(1)
|
||||||
defer p.workResultLock.Done()
|
defer p.workResultLock.Done()
|
||||||
|
|
||||||
uuid := UniqueId()
|
|
||||||
tcpsrcaddr := conn.RemoteAddr().(*net.TCPAddr)
|
tcpsrcaddr := conn.RemoteAddr().(*net.TCPAddr)
|
||||||
|
|
||||||
|
if p.localIdToConnMapSize >= p.maxconn {
|
||||||
|
loggo.Info("too many connections %d, client accept new local tcp fail %s", p.localIdToConnMapSize, tcpsrcaddr.String())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
uuid := UniqueId()
|
||||||
|
|
||||||
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()
|
||||||
@ -484,6 +492,10 @@ func (p *Client) Accept() error {
|
|||||||
now := time.Now()
|
now := time.Now()
|
||||||
clientConn := p.getClientConnByAddr(srcaddr.String())
|
clientConn := p.getClientConnByAddr(srcaddr.String())
|
||||||
if clientConn == nil {
|
if clientConn == nil {
|
||||||
|
if p.localIdToConnMapSize >= p.maxconn {
|
||||||
|
loggo.Info("too many connections %d, client accept new local udp fail %s", p.localIdToConnMapSize, srcaddr.String())
|
||||||
|
continue
|
||||||
|
}
|
||||||
uuid := UniqueId()
|
uuid := UniqueId()
|
||||||
clientConn = &ClientConn{ipaddr: srcaddr, id: uuid, activeRecvTime: now, activeSendTime: now, close: false}
|
clientConn = &ClientConn{ipaddr: srcaddr, id: uuid, activeRecvTime: now, activeSendTime: now, close: false}
|
||||||
p.addClientConn(uuid, srcaddr.String(), clientConn)
|
p.addClientConn(uuid, srcaddr.String(), clientConn)
|
||||||
|
13
cmd/main.go
13
cmd/main.go
@ -71,6 +71,9 @@ Usage:
|
|||||||
|
|
||||||
-sock5 开启sock5转发,默认0
|
-sock5 开启sock5转发,默认0
|
||||||
Turn on sock5 forwarding, default 0 is off
|
Turn on sock5 forwarding, default 0 is off
|
||||||
|
|
||||||
|
-maxconn 最大连接数,默认1000
|
||||||
|
the max num of connections, default 1000
|
||||||
`
|
`
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
@ -90,6 +93,7 @@ func main() {
|
|||||||
tcpmode_stat := flag.Int("tcp_stat", 0, "print tcp stat")
|
tcpmode_stat := flag.Int("tcp_stat", 0, "print tcp stat")
|
||||||
loglevel := flag.String("loglevel", "info", "log level")
|
loglevel := flag.String("loglevel", "info", "log level")
|
||||||
open_sock5 := flag.Int("sock5", 0, "sock5 mode")
|
open_sock5 := flag.Int("sock5", 0, "sock5 mode")
|
||||||
|
maxconn := flag.Int("maxconn", 0, "max num of connections")
|
||||||
flag.Usage = func() {
|
flag.Usage = func() {
|
||||||
fmt.Printf(usage)
|
fmt.Printf(usage)
|
||||||
}
|
}
|
||||||
@ -132,7 +136,7 @@ func main() {
|
|||||||
loggo.Info("key %d", *key)
|
loggo.Info("key %d", *key)
|
||||||
|
|
||||||
if *t == "server" {
|
if *t == "server" {
|
||||||
s, err := pingtunnel.NewServer(*key)
|
s, err := pingtunnel.NewServer(*key, *maxconn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
loggo.Error("ERROR: %s", err.Error())
|
loggo.Error("ERROR: %s", err.Error())
|
||||||
return
|
return
|
||||||
@ -143,8 +147,7 @@ func main() {
|
|||||||
loggo.Error("Run ERROR: %s", err.Error())
|
loggo.Error("Run ERROR: %s", err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
} else if *t == "client" {
|
||||||
if *t == "client" {
|
|
||||||
|
|
||||||
loggo.Info("type %s", *t)
|
loggo.Info("type %s", *t)
|
||||||
loggo.Info("listen %s", *listen)
|
loggo.Info("listen %s", *listen)
|
||||||
@ -161,7 +164,7 @@ func main() {
|
|||||||
|
|
||||||
c, err := pingtunnel.NewClient(*listen, *server, *target, *timeout, *key,
|
c, err := pingtunnel.NewClient(*listen, *server, *target, *timeout, *key,
|
||||||
*tcpmode, *tcpmode_buffersize, *tcpmode_maxwin, *tcpmode_resend_timems, *tcpmode_compress,
|
*tcpmode, *tcpmode_buffersize, *tcpmode_maxwin, *tcpmode_resend_timems, *tcpmode_compress,
|
||||||
*tcpmode_stat, *open_sock5)
|
*tcpmode_stat, *open_sock5, *maxconn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
loggo.Error("ERROR: %s", err.Error())
|
loggo.Error("ERROR: %s", err.Error())
|
||||||
return
|
return
|
||||||
@ -173,6 +176,8 @@ func main() {
|
|||||||
loggo.Error("Run ERROR: %s", err.Error())
|
loggo.Error("Run ERROR: %s", err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
return
|
||||||
}
|
}
|
||||||
for {
|
for {
|
||||||
time.Sleep(time.Hour)
|
time.Sleep(time.Hour)
|
||||||
|
31
server.go
31
server.go
@ -10,10 +10,11 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
func NewServer(key int) (*Server, error) {
|
func NewServer(key int, maxconn int) (*Server, error) {
|
||||||
return &Server{
|
return &Server{
|
||||||
exit: false,
|
exit: false,
|
||||||
key: key,
|
key: key,
|
||||||
|
maxconn: maxconn,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -22,15 +23,17 @@ type Server struct {
|
|||||||
key int
|
key int
|
||||||
interval *time.Ticker
|
interval *time.Ticker
|
||||||
workResultLock sync.WaitGroup
|
workResultLock sync.WaitGroup
|
||||||
|
maxconn int
|
||||||
|
|
||||||
conn *icmp.PacketConn
|
conn *icmp.PacketConn
|
||||||
|
|
||||||
localConnMap sync.Map
|
localConnMap sync.Map
|
||||||
|
|
||||||
sendPacket uint64
|
sendPacket uint64
|
||||||
recvPacket uint64
|
recvPacket uint64
|
||||||
sendPacketSize uint64
|
sendPacketSize uint64
|
||||||
recvPacketSize uint64
|
recvPacketSize uint64
|
||||||
|
localConnMapSize int
|
||||||
|
|
||||||
echoId int
|
echoId int
|
||||||
echoSeq int
|
echoSeq int
|
||||||
@ -118,6 +121,11 @@ func (p *Server) processPacket(packet *Packet) {
|
|||||||
localConn := p.getServerConnById(id)
|
localConn := p.getServerConnById(id)
|
||||||
if localConn == nil {
|
if localConn == nil {
|
||||||
|
|
||||||
|
if p.localConnMapSize >= p.maxconn {
|
||||||
|
loggo.Info("too many connections %d, server connected target fail %s", p.localConnMapSize, packet.my.Target)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
if packet.my.Tcpmode > 0 {
|
if packet.my.Tcpmode > 0 {
|
||||||
|
|
||||||
addr := packet.my.Target
|
addr := packet.my.Target
|
||||||
@ -449,8 +457,13 @@ func (p *Server) checkTimeoutConn() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (p *Server) showNet() {
|
func (p *Server) showNet() {
|
||||||
loggo.Info("send %dPacket/s %dKB/s recv %dPacket/s %dKB/s",
|
p.localConnMapSize = 0
|
||||||
p.sendPacket, p.sendPacketSize/1024, p.recvPacket, p.recvPacketSize/1024)
|
p.localConnMap.Range(func(key, value interface{}) bool {
|
||||||
|
p.localConnMapSize++
|
||||||
|
return true
|
||||||
|
})
|
||||||
|
loggo.Info("send %dPacket/s %dKB/s recv %dPacket/s %dKB/s %dConnections",
|
||||||
|
p.sendPacket, p.sendPacketSize/1024, p.recvPacket, p.recvPacketSize/1024, p.localConnMapSize)
|
||||||
p.sendPacket = 0
|
p.sendPacket = 0
|
||||||
p.recvPacket = 0
|
p.recvPacket = 0
|
||||||
p.sendPacketSize = 0
|
p.sendPacketSize = 0
|
||||||
|
Loading…
Reference in New Issue
Block a user