所以我试图在Windows中的套接字上获取文件句柄。
使用如下:
address, err := net.ResolveTCPAddr("tcp", "192.168.9.144:8080")
if err != nil {
fmt.Println(err)
}
conn, err := net.DialTCP("tcp", nil, address)
fmt.Println("Connected")
// conn, err := net.DialTCP("tcp", nil, address)
if err != nil {
fmt.Println("Can't conenct")
log.Fatal(err)
}
conn.File()
conn.Fd()
conn.File()失败并声明它不受Windows支持
接下来我尝试使用windows api函数_get_osfhandle
var (
procGetOSfHandle = msvcrt.NewProc("_get_osfhandle")
)
func GetOSfHandle(fd uintptr) (uintptr, error) {
value, _, err := procGetOSfHandle.Call(fd)
return value, err
}
hand, _ := GetOSfHandle(uintptr(unsafe.Pointer(conn)))
手牌返回4294967295,结果证明不是真实的,因为" xff \ xff \ xff \ xff"
然后我尝试使用Windows API for socket并遇到了WSARecv的问题。这是使用的以下代码:
var d syscall.WSAData
syscall.WSAStartup(uint32(0x202), &d)
fd, _ := syscall.Socket(syscall.AF_INET, syscall.SOCK_STREAM, 0)
addr := syscall.SockaddrInet4{Port: 8080, Addr: [4]byte{192, 168, 9, 144}}
var buf [4]byte
syscall.Connect(fd, &addr)
dataBuf := syscall.WSABuf{Len: uint32(4), Buf: &buf[0]}
o := syscall.Overlapped{}
flags := uint32(0)
qty := uint32(0)
syscall.WSARecv(fd, &dataBuf, 1, &qty, &flags, &o, nil)
fmt.Println(buf)
代码连接但我看不到并收到数据。似乎我似乎没有正确的WSARecv选项。
非常感谢任何帮助。