golang查询服务器上nfs服务所占用的端口号golang如何使用rpcinfo包
可以使用以下代码查询服务器上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 著作权归作者所有。请勿转载和采集!