Skip to content

Commit a257819

Browse files
committed
refactor(sampledconn): Add Windows OSPeekConn impl
1 parent ca3d29f commit a257819

File tree

2 files changed

+45
-1
lines changed

2 files changed

+45
-1
lines changed

p2p/transport/tcpreuse/internal/sampledconn/sampledconn_other.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
//go:build !unix
1+
//go:build !unix && !windows
22

33
package sampledconn
44

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
//go:build windows
2+
3+
package sampledconn
4+
5+
import (
6+
"errors"
7+
"io"
8+
"syscall"
9+
10+
"golang.org/x/sys/windows"
11+
)
12+
13+
func OSPeekConn(conn syscall.Conn) (PeekedBytes, error) {
14+
s := PeekedBytes{}
15+
16+
rawConn, err := conn.SyscallConn()
17+
if err != nil {
18+
return s, err
19+
}
20+
21+
var readErr error
22+
var n uint32
23+
err = rawConn.Read(func(fd uintptr) bool {
24+
flags := uint32(windows.MSG_PEEK | windows.MSG_WAITALL)
25+
wsabuf := windows.WSABuf{
26+
Len: uint32(len(s)),
27+
Buf: &s[0],
28+
}
29+
30+
readErr = windows.WSARecv(windows.Handle(fd), &wsabuf, 1, &n, &flags, nil, nil)
31+
return !errors.Is(readErr, windows.WSAEWOULDBLOCK)
32+
})
33+
if err != nil {
34+
return s, err
35+
}
36+
if readErr != nil {
37+
return s, readErr
38+
}
39+
if n < peekSize {
40+
return s, io.EOF
41+
}
42+
43+
return s, nil
44+
}

0 commit comments

Comments
 (0)