|
|
@@ -2,6 +2,7 @@ package buf
|
|
|
|
|
|
import (
|
|
|
"io"
|
|
|
+ "net"
|
|
|
"syscall"
|
|
|
"time"
|
|
|
)
|
|
|
@@ -38,6 +39,11 @@ func WriteAllBytes(writer io.Writer, payload []byte) error {
|
|
|
return nil
|
|
|
}
|
|
|
|
|
|
+func isPacketReader(reader io.Reader) bool {
|
|
|
+ _, ok := reader.(net.PacketConn)
|
|
|
+ return ok
|
|
|
+}
|
|
|
+
|
|
|
// NewReader creates a new Reader.
|
|
|
// The Reader instance doesn't take the ownership of reader.
|
|
|
func NewReader(reader io.Reader) Reader {
|
|
|
@@ -45,6 +51,12 @@ func NewReader(reader io.Reader) Reader {
|
|
|
return mr
|
|
|
}
|
|
|
|
|
|
+ if isPacketReader(reader) {
|
|
|
+ return &PacketReader{
|
|
|
+ Reader: reader,
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
if useReadv {
|
|
|
if sc, ok := reader.(syscall.Conn); ok {
|
|
|
rawConn, err := sc.SyscallConn()
|
|
|
@@ -61,14 +73,25 @@ func NewReader(reader io.Reader) Reader {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+func isPacketWriter(writer io.Writer) bool {
|
|
|
+ if _, ok := writer.(net.PacketConn); ok {
|
|
|
+ return true
|
|
|
+ }
|
|
|
+
|
|
|
+ // If the writer doesn't implement syscall.Conn, it is probably not a TCP connection.
|
|
|
+ if _, ok := writer.(syscall.Conn); !ok {
|
|
|
+ return true
|
|
|
+ }
|
|
|
+ return false
|
|
|
+}
|
|
|
+
|
|
|
// NewWriter creates a new Writer.
|
|
|
func NewWriter(writer io.Writer) Writer {
|
|
|
if mw, ok := writer.(Writer); ok {
|
|
|
return mw
|
|
|
}
|
|
|
|
|
|
- if _, ok := writer.(syscall.Conn); !ok {
|
|
|
- // If the writer doesn't implement syscall.Conn, it is probably not a TCP connection.
|
|
|
+ if isPacketWriter(writer) {
|
|
|
return &SequentialWriter{
|
|
|
Writer: writer,
|
|
|
}
|