mirror of
https://github.com/ehang-io/nps.git
synced 2025-07-03 04:53:50 +00:00
77 lines
1.4 KiB
Go
77 lines
1.4 KiB
Go
package pool
|
|
|
|
import (
|
|
"ehang.io/nps/lib/common"
|
|
"github.com/panjf2000/ants/v2"
|
|
"io"
|
|
"net"
|
|
"sync"
|
|
)
|
|
|
|
var connBp = NewBufferPool(MaxReadSize)
|
|
var packetBp = NewBufferPool(1500)
|
|
|
|
const MaxReadSize = 32 * 1024
|
|
|
|
var CopyConnGoroutinePool *ants.PoolWithFunc
|
|
var CopyPacketGoroutinePool *ants.PoolWithFunc
|
|
|
|
type CopyConnGpParams struct {
|
|
Writer io.Writer
|
|
Reader io.Reader
|
|
Wg *sync.WaitGroup
|
|
}
|
|
|
|
type CopyPacketGpParams struct {
|
|
RPacket net.PacketConn
|
|
WPacket net.PacketConn
|
|
Wg *sync.WaitGroup
|
|
}
|
|
|
|
func init() {
|
|
var err error
|
|
CopyConnGoroutinePool, err = ants.NewPoolWithFunc(1000000, func(i interface{}) {
|
|
gpp, ok := i.(*CopyConnGpParams)
|
|
if !ok {
|
|
return
|
|
}
|
|
buf := connBp.Get()
|
|
_, _ = common.CopyBuffer(gpp.Writer, gpp.Reader, buf)
|
|
connBp.Put(buf)
|
|
gpp.Wg.Done()
|
|
if v, ok := gpp.Reader.(*net.TCPConn); ok {
|
|
_ = v.CloseWrite()
|
|
}
|
|
if v, ok := gpp.Writer.(*net.TCPConn); ok {
|
|
_ = v.CloseRead()
|
|
}
|
|
})
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
CopyPacketGoroutinePool, err = ants.NewPoolWithFunc(1000000, func(i interface{}) {
|
|
cpp, ok := i.(*CopyPacketGpParams)
|
|
if !ok {
|
|
return
|
|
}
|
|
buf := connBp.Get()
|
|
for {
|
|
n, addr, err := cpp.RPacket.ReadFrom(buf)
|
|
if err != nil {
|
|
break
|
|
}
|
|
_, err = cpp.WPacket.WriteTo(buf[:n], addr)
|
|
if err != nil {
|
|
break
|
|
}
|
|
}
|
|
connBp.Put(buf)
|
|
_ = cpp.RPacket.Close()
|
|
_ = cpp.WPacket.Close()
|
|
cpp.Wg.Done()
|
|
})
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
}
|