mirror of https://github.com/v2ray/v2ray-core
				
				
				
			fixed ReadV issue for windows
							parent
							
								
									1a7b2337f8
								
							
						
					
					
						commit
						847b289798
					
				| 
						 | 
				
			
			@ -63,7 +63,12 @@ func NewReader(reader io.Reader) Reader {
 | 
			
		|||
			if err != nil {
 | 
			
		||||
				newError("failed to get sysconn").Base(err).WriteToLog()
 | 
			
		||||
			} else {
 | 
			
		||||
				return NewReadVReader(reader, rawConn)
 | 
			
		||||
				/* Check if ReadVReader Can be used on this reader first
 | 
			
		||||
				   Fix https://github.com/v2ray/v2ray-core/issues/1666
 | 
			
		||||
				*/
 | 
			
		||||
				if ok, _ := checkReadVConstraint(rawConn); ok {
 | 
			
		||||
					return NewReadVReader(reader, rawConn)
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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