1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- package conn
- import (
- "github.com/cnlh/nps/lib/common"
- "github.com/cnlh/nps/lib/file"
- "github.com/cnlh/nps/lib/pool"
- "github.com/cnlh/nps/lib/rate"
- "net"
- )
- type Link struct {
- Id int //id
- ConnType string //连接类型
- Host string //目标
- En int //加密
- De int //解密
- Crypt bool //加密
- Conn *Conn
- Flow *file.Flow
- UdpListener *net.UDPConn
- Rate *rate.Rate
- UdpRemoteAddr *net.UDPAddr
- MsgCh chan []byte
- MsgConn *Conn
- StatusCh chan bool
- }
- func NewLink(id int, connType string, host string, en, de int, crypt bool, c *Conn, flow *file.Flow, udpListener *net.UDPConn, rate *rate.Rate, UdpRemoteAddr *net.UDPAddr) *Link {
- return &Link{
- Id: id,
- ConnType: connType,
- Host: host,
- En: en,
- De: de,
- Crypt: crypt,
- Conn: c,
- Flow: flow,
- UdpListener: udpListener,
- Rate: rate,
- UdpRemoteAddr: UdpRemoteAddr,
- MsgCh: make(chan []byte),
- StatusCh: make(chan bool),
- }
- }
- func (s *Link) Run(flow bool) {
- go func() {
- for {
- select {
- case content := <-s.MsgCh:
- if len(content) == len(common.IO_EOF) && string(content) == common.IO_EOF {
- if s.Conn != nil {
- s.Conn.Close()
- }
- return
- } else {
- if s.UdpListener != nil && s.UdpRemoteAddr != nil {
- s.UdpListener.WriteToUDP(content, s.UdpRemoteAddr)
- } else {
- s.Conn.Write(content)
- }
- if flow {
- s.Flow.Add(0, len(content))
- }
- if s.ConnType == common.CONN_UDP {
- return
- }
- s.MsgConn.WriteWriteSuccess(s.Id)
- pool.PutBufPoolCopy(content)
- }
- }
- }
- }()
- }
|