【问题标题】:cannot use int(fd) (value of type int) as syscall.Handle value in argument to syscall.SetsockoptInt不能在 syscall.SetsockoptInt 的参数中使用 int(fd)(int 类型的值)作为 syscall.Handle 值
【发布时间】:2021-08-16 21:24:09
【问题描述】:

我正在使用 golang 编写脚本,在这部分代码中,我在这一行中遇到错误:

syscall.SetsockoptInt(int(fd), syscall.IPPROTO_TCP, syscall.TCP_NODELAY, 1)

具体来说:

int(fd)

var globalTr = &http.Transport{
    MaxIdleConnsPerHost: 4096,
    MaxIdleConns:        4096,
    MaxConnsPerHost:     4096,
    TLSHandshakeTimeout: 0 * time.Second,
    TLSClientConfig:     &tls.Config{InsecureSkipVerify: true},
    DialContext: (&net.Dialer{
        Control: func(network, address string, c syscall.RawConn) error {
            return c.Control(func(fd uintptr) {
                syscall.SetsockoptInt(int(fd), syscall.IPPROTO_TCP, syscall.TCP_NODELAY, 1)
            })
        },
    }).DialContext,
}

错误是:

cannot use int(fd) (value of type int) as syscall.Handle value in argument to syscall.SetsockoptInt

【问题讨论】:

  • syscall 包是非常特定于平台的,因此您几乎应该始终只在具有正确构建约束的文件中使用它。代码看起来像是针对unix的,而错误来自windows。
  • 请注意,如果您的唯一目标是设置TCP_NODELAY ,那么特定于平台的工作已经在TCPConn.SetNoDelay 中为您完成
  • @JimB 我刚刚在 unix 环境中编译它,它工作得很好,我会接受的。谢谢

标签: go compiler-errors


【解决方案1】:

根据您的平台,系统调用的原型可能会有所不同。

在这种情况下,Windows 的原型是:

func SetsockoptInt(fd Handle, level, opt int, value int) (err error)

Unix 中的原型是:

func SetsockoptInt(fd, level, opt int, value int) (err error) {

您似乎正试图在 Unix 系统上使用 Window 的原型,这给您一个类型错误,因为 Handle 被认为与 int 不同。

如 cmets 系统调用中所述,函数特定于指定的系统。

有关cross-compiling 的更多信息,请参阅此问题。如果您不进行交叉编译,则需要确保您的环境正确指定了您的目标环境。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-23
    • 1970-01-01
    • 2017-11-22
    • 2021-11-16
    • 2020-12-03
    • 1970-01-01
    相关资源
    最近更新 更多