readv_constraint_windows.go 954 B

12345678910111213141516171819202122232425262728293031323334353637
  1. // +build windows
  2. package buf
  3. import (
  4. "syscall"
  5. )
  6. func checkReadVConstraint(conn syscall.RawConn) (bool, error) {
  7. var isSocketReady = false
  8. var reason error
  9. /*
  10. In Windows, WSARecv system call only support socket connection.
  11. It it required to check if the given fd is of a socket type
  12. Fix https://github.com/v2ray/v2ray-core/issues/1666
  13. Additional Information:
  14. https://docs.microsoft.com/en-us/windows/desktop/api/winsock2/nf-winsock2-wsarecv
  15. https://docs.microsoft.com/en-us/windows/desktop/api/winsock/nf-winsock-getsockopt
  16. https://docs.microsoft.com/en-us/windows/desktop/WinSock/sol-socket-socket-options
  17. */
  18. err := conn.Control(func(fd uintptr) {
  19. var val [4]byte
  20. var le = int32(len(val))
  21. err := syscall.Getsockopt(syscall.Handle(fd), syscall.SOL_SOCKET, syscall.SO_RCVBUF, &val[0], &le)
  22. if err != nil {
  23. isSocketReady = false
  24. } else {
  25. isSocketReady = true
  26. }
  27. reason = err
  28. })
  29. return isSocketReady, err
  30. }