可以使用以下代码查询服务器上nfs服务所占用的端口号:

package main

import (
    "fmt"
    "net"
    "os"
    "strconv"

    "golang.org/x/sys/unix"
)

func main() {
    // 获取nfs服务的rpc程序号
    nfsProgNum, err := unix.GetRPCProgramNumber("nfs")
    if err != nil {
        fmt.Println("Failed to get NFS RPC program number:", err)
        os.Exit(1)
    }

    // 获取nfs服务的端口号
    port, err := getNFSRpcPort(nfsProgNum)
    if err != nil {
        fmt.Println("Failed to get NFS RPC port:", err)
        os.Exit(1)
    }

    fmt.Println("NFS RPC port:", port)
}

func getNFSRpcPort(nfsProgNum uint32) (int, error) {
    // 查询服务器上的rpcinfo信息
    rpcInfo, err := net.LookupIP("localhost")
    if err != nil {
        return 0, err
    }

    // 遍历rpcinfo信息,找到nfs服务所占用的端口号
    for _, ip := range rpcInfo {
        tcpAddr := &net.TCPAddr{
            IP:   ip,
            Port: 0, // 0表示任意端口
        }
        conn, err := net.DialTCP("tcp", nil, tcpAddr)
        if err != nil {
            continue
        }
        defer conn.Close()

        // 构造rpc请求
        xid := uint32(1)
        req := unix.RPCMsg{
            Xid:    xid,
            Type:   unix.Call,
            RPCVer: unix.Version,
            Prog:   nfsProgNum,
            Vers:   3, // NFSv3
            Proc:   0, // NULL
        }

        // 发送rpc请求
        _, err = conn.Write(req.Bytes())
        if err != nil {
            continue
        }

        // 接收rpc响应
        buf := make([]byte, 1024)
        n, err := conn.Read(buf)
        if err != nil {
            continue
        }

        // 解析rpc响应
        resp := unix.RPCMsg{}
        err = resp.Unmarshal(buf[:n])
        if err != nil {
            continue
        }

        // 返回端口号
        return int(resp.Port), nil
    }

    return 0, fmt.Errorf("NFS RPC port not found")
}

使用rpcinfo包也可以查询服务器上的rpc服务信息,示例代码如下:

package main

import (
    "fmt"
    "log"
    "net/rpc"
    "net/rpc/jsonrpc"
)

func main() {
    // 连接rpc服务
    client, err := jsonrpc.Dial("tcp", "localhost:111")
    if err != nil {
        log.Fatal("dialing:", err)
    }

    // 查询nfs服务的端口号
    var port int
    err = client.Call("rpcinfo.Getport", []interface{}{"nfs", 3, 0, 0}, &port)
    if err != nil {
        log.Fatal("rpc call failed:", err)
    }

    fmt.Println("NFS RPC port:", port)
}

以上代码中,使用jsonrpc.Dial连接rpc服务,然后调用rpcinfo包中的Getport方法查询nfs服务的端口号。需要注意的是,rpc服务默认监听在111端口,因此需要指定连接的地址为"localhost:111"


原文地址: https://www.cveoy.top/t/topic/fNfv 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录