mirror of https://github.com/v2ray/v2ray-core
Kslr
6 years ago
3 changed files with 52 additions and 1 deletions
@ -0,0 +1,9 @@
|
||||
// +build !windows
|
||||
|
||||
package buf |
||||
|
||||
import "syscall" |
||||
|
||||
func checkReadVConstraint(conn syscall.RawConn) (bool, error) { |
||||
return true, nil |
||||
} |
@ -0,0 +1,37 @@
|
||||
// +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 |
||||
} |
Loading…
Reference in new issue