fix dtls connection
This commit is contained in:
73
internal/util/dtls/conn.go
Normal file
73
internal/util/dtls/conn.go
Normal file
@ -0,0 +1,73 @@
|
||||
package dtls
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"net"
|
||||
|
||||
"github.com/go-gost/core/common/bufpool"
|
||||
)
|
||||
|
||||
type dtlsConn struct {
|
||||
net.Conn
|
||||
rbuf bytes.Buffer
|
||||
bufferSize int
|
||||
}
|
||||
|
||||
func Conn(c net.Conn, bufferSize int) net.Conn {
|
||||
return &dtlsConn{
|
||||
Conn: c,
|
||||
bufferSize: bufferSize,
|
||||
}
|
||||
}
|
||||
|
||||
func (c *dtlsConn) Read(p []byte) (n int, err error) {
|
||||
/*
|
||||
defer func() {
|
||||
logger.Default().Debugf("dtls: read data %d/%d, %v", n, len(p), err)
|
||||
}()
|
||||
*/
|
||||
|
||||
if c.rbuf.Len() > 0 {
|
||||
return c.rbuf.Read(p)
|
||||
}
|
||||
|
||||
bufferSize := c.bufferSize
|
||||
if len(p) >= bufferSize {
|
||||
return c.Conn.Read(p)
|
||||
}
|
||||
|
||||
buf := bufpool.Get(bufferSize)
|
||||
defer bufpool.Put(buf)
|
||||
|
||||
nn, err := c.Conn.Read(*buf)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
n = copy(p, (*buf)[:nn])
|
||||
c.rbuf.Write((*buf)[n:nn])
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func (c *dtlsConn) Write(p []byte) (n int, err error) {
|
||||
/*
|
||||
defer func() {
|
||||
logger.Default().Debugf("dtls: write data %d, %v", n, err)
|
||||
}()
|
||||
*/
|
||||
|
||||
for len(p) > 0 {
|
||||
nn := c.bufferSize
|
||||
if nn > len(p) {
|
||||
nn = len(p)
|
||||
}
|
||||
nn, err = c.Conn.Write(p[:nn])
|
||||
n += nn
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
p = p[nn:]
|
||||
}
|
||||
return
|
||||
}
|
Reference in New Issue
Block a user