Windows系统调用

时间:2015-04-08 21:06:29

标签: winapi go

所以我试图在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选项。

非常感谢任何帮助。

0 个答案:

没有答案