【问题标题】:How to read/write from/to socket fd using Go on Windows?如何在 Windows 上使用 Go 读取/写入套接字 fd?
【发布时间】:2020-12-06 13:13:58
【问题描述】:

我一直在尝试syscall.Socket创建fd,调用syscall.Connectsyscall.Write()

但是syscall.Write()返回错误The parameter is incorrect.

【问题讨论】:

  • 你能分享一个最小的代码示例,代表你正在尝试做的事情吗?对于当前形式的问题,您可以期待的唯一真正答案是一个含蓄的“RTFM”。如果幸运的话,也许是一个“阅读源代码,看看错误来自哪里”
  • 感谢您的回复。我的目标是让c++ go share sockets using fd,这里我测试如何写和读fd。

标签: windows sockets go


【解决方案1】:
package main

import (
    "errors"
    "fmt"
    "os"
    "syscall"
)

func main() {
    fd, _ := syscall.Socket(syscall.AF_INET, syscall.SOCK_STREAM, syscall.IPPROTO_TCP)

    addr := syscall.SockaddrInet4{
        Port: 30001,
        Addr: [4]byte{172, 16, 1, 222},
    }

    connectErr := syscall.Connect(fd, &addr)

    defer syscall.Close(fd)

    if connectErr != nil {
        fmt.Println(connectErr)
        return
    }

    writeLen, err := syscall.Write(fd, []byte("test"))

    /* file, err := MakeTunFile(uintptr(fd))
    if err != nil {
        fmt.Println(err)
        return
    }

    writeLen, err := file.WriteString("test") */

    fmt.Println(writeLen) // 0
    fmt.Println(err)      // The parameter is incorrect.
}

// MakeTunFile returns an os.File object from a TUN file descriptor `fd`.
func MakeTunFile(fd uintptr) (*os.File, error) {
    if fd < 0 {
        return nil, errors.New("TUN file descriptor error")
    }
    file := os.NewFile(fd, "")
    if file == nil {
        return nil, errors.New("open TUN file descriptor error")
    }
    return file, nil
}

【讨论】:

  • 使用windows.WSASend成功
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-21
  • 2020-08-21
  • 1970-01-01
  • 2020-09-15
  • 1970-01-01
相关资源
最近更新 更多