什么可以导致client.Call rpc在Go(golang)中返回错误?

时间:2014-03-14 17:43:09

标签: go rpc

c.Call(...)何时返回非零值?

c.Call(...)只能在发生网络故障时丢失错误(数据包丢失或超时或沿着这些行发生的事情)?

如果服务器srv崩溃,c.Call(...)会返回错误吗?

具体来说,c.Call(...)可以在请求成功到达srv之后但在rpcname处理函数返回之前返回错误?

import (
    "net/rpc"
    "fmt"
)

func call(srv string, rpcname string, args interface{}, reply interface{}) bool {
    c, errx := rpc.Dial("unix", srv)
    if errx != nil {
        return false
    }
    defer c.Close()

    err := c.Call(rpcname, args, reply)
    if err == nil {
        return true
    }

    fmt.Println(err)
    return false
}

1 个答案:

答案 0 :(得分:1)

如果您查看client.go in the source code for net/rpc,您会看到设置call.Error的很多行。这些应该显示Call将返回错误的所有条件。

其中许多是在遇到来自ClientCodec.WriteRequestClientCodec.ReadResponseBody的错误时生成的。有关详细信息,请参阅ClientCodec docs

遇到意外的EOF时也会出现几个错误,而客户端关闭时会出现ErrShutdown