12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- 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)
- }
- }
|