Golang中mips系统出现errno错误码-89是什么问题

Golang中mips系统出现errno错误码-89是什么问题 我正在使用Go语言http包的client.Do函数,但一直遇到错误。

错误码是-89,操作系统是mips 32位,因此我目前使用的是Go语言1.8版本。

由于epollcreate错误,无法使用其他更高版本。

为什么在client.Do函数中会出现错误码-89?

如果用不同的GOARCH和GOOS编译相同的源代码,它可以正常工作。

这个问题只出现在这台mips设备上。

请帮我分析一下原因。

PANIC panic: Put http://192.168.10.2:3444/conf: dial tcp 192.168.10.2 : errno -89

OS Linux TLR-2855KS 2.6.36+ #36 Wed Jul 15 16:06:23 KST 2020 mips unknown

GO VERSION go version go1.8.7 windows/amd64

Code

type REQBODY struct {
    T1 string `json:"t1"`
    T2 string `json:"t2"`
    T3 string `json:"t3"`
    T4 string `json:"t4"`
    T5 string `json:"t5"`
}

func send_Request() int {

    var body = REQBODY{"a", "b", "c", "d", "e"}

    client := &http.Client{}

    // marshal User to json
    json, err := json.Marshal(body)
    if err != nil {
        panic(err)
    }

    req, err := http.NewRequest(http.MethodPut, URL, bytes.NewBuffer(json))
    if err != nil {
        panic(err)
    }

    req.Header.Set("Content-Type", "application/json; charset=utf-8")

    resp, err := client.Do(req)
    if err != nil {
        panic(err)   => PANIC!!
    }

    return 1
}

更多关于Golang中mips系统出现errno错误码-89是什么问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

这很可能与以下问题相同:

Cross Compiling for MIPS, runtime error

代码:

package main 
import “fmt” 
import “os/exec” 
func main() { 
out, _ := exec.Command(“date”).Output() 
fmt.Println(string(out)) 
} 
go version: 
go version go1.14.6 windows/amd64 
go env: 
set GO111MODULE= 
set GOARCH=mipsle 
set GOBIN= 
set GOCACHE=C:\Users\wakoy\AppData\Local\go-build 
set GOENV=C:\Users\wakoy\AppData\Roaming\go\env 
set GOEXE= 
set GOFLAGS= 
set GOHOSTARCH=amd64 
set GOHOSTOS=windows 
set GOINSECURE= 
set GONOPROXY= 
set GONOSUMDB= 
set GOOS=linux 
set GOPATH=C:\Users\w…

我当时的想法是,您使用的内核版本太旧,无法支持 Go 所需的功能。

我认为错误 89 表示参数中缺少源地址。

更多关于Golang中mips系统出现errno错误码-89是什么问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


这是一个典型的系统调用错误码问题。错误码-89对应的是ENOSPC(No space left on device),但在网络连接场景中,这通常表示文件描述符耗尽或系统资源不足。

在MIPS架构上,这个错误通常与以下原因相关:

  1. 文件描述符限制:系统或进程的文件描述符达到上限
  2. 网络资源限制:socket创建失败
  3. Go 1.8在MIPS上的已知问题:早期Go版本在某些架构上的资源管理存在问题

检查当前系统的文件描述符限制:

package main

import (
    "fmt"
    "syscall"
)

func main() {
    var rlimit syscall.Rlimit
    err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &rlimit)
    if err != nil {
        fmt.Printf("获取限制失败: %v\n", err)
        return
    }
    fmt.Printf("当前文件描述符限制: 软限制=%d, 硬限制=%d\n", 
        rlimit.Cur, rlimit.Max)
}

增加文件描述符限制的示例:

func increaseFileDescriptorLimit() error {
    var rlimit syscall.Rlimit
    err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &rlimit)
    if err != nil {
        return err
    }
    
    rlimit.Cur = 10240  // 增加到10240
    rlimit.Max = 10240
    return syscall.Setrlimit(syscall.RLIMIT_NOFILE, &rlimit)
}

检查当前进程打开的文件描述符数量:

func countOpenFiles() int {
    count := 0
    for i := 0; i < 1024; i++ {
        _, err := syscall.FcntlInt(uintptr(i), syscall.F_GETFD, 0)
        if err == nil {
            count++
        }
    }
    return count
}

针对HTTP客户端,可以添加连接池管理来减少资源消耗:

func createHTTPClient() *http.Client {
    transport := &http.Transport{
        MaxIdleConns:        100,
        MaxIdleConnsPerHost: 10,
        IdleConnTimeout:     30 * time.Second,
    }
    
    return &http.Client{
        Transport: transport,
        Timeout:   30 * time.Second,
    }
}

如果问题持续存在,可以添加详细的错误日志来追踪:

resp, err := client.Do(req)
if err != nil {
    // 获取更详细的系统错误信息
    if syscallErr, ok := err.(*net.OpError).Err.(*os.SyscallError); ok {
        fmt.Printf("系统调用错误: %v, 错误码: %v\n", 
            syscallErr.Syscall, syscallErr.Err)
    }
    panic(err)
}

在MIPS设备上,还需要检查网络配置:

func checkNetworkConfig() {
    // 检查路由表
    fmt.Println("=== 路由表 ===")
    data, _ := exec.Command("route", "-n").Output()
    fmt.Println(string(data))
    
    // 检查ARP缓存
    fmt.Println("=== ARP缓存 ===")
    data, _ = exec.Command("arp", "-a").Output()
    fmt.Println(string(data))
}

这个问题在Go 1.8的MIPS架构上比较常见,建议如果可能的话,尝试使用更高版本的Go(1.10+),这些版本对MIPS架构的支持更加完善。

回到顶部