| 12345678910111213141516171819202122232425262728293031323334353637 |
- // +build windows
- package buf
- import (
- "syscall"
- )
- func checkReadVConstraint(conn syscall.RawConn) (bool, error) {
- var isSocketReady = false
- var reason error
- /*
- In Windows, WSARecv system call only support socket connection.
- It it required to check if the given fd is of a socket type
- Fix https://github.com/v2ray/v2ray-core/issues/1666
- Additional Information:
- https://docs.microsoft.com/en-us/windows/desktop/api/winsock2/nf-winsock2-wsarecv
- https://docs.microsoft.com/en-us/windows/desktop/api/winsock/nf-winsock-getsockopt
- https://docs.microsoft.com/en-us/windows/desktop/WinSock/sol-socket-socket-options
- */
- err := conn.Control(func(fd uintptr) {
- var val [4]byte
- var le = int32(len(val))
- err := syscall.Getsockopt(syscall.Handle(fd), syscall.SOL_SOCKET, syscall.SO_RCVBUF, &val[0], &le)
- if err != nil {
- isSocketReady = false
- } else {
- isSocketReady = true
- }
- reason = err
- })
- return isSocketReady, err
- }
|