【问题标题】:RPC clnt_call sends tcp [ FIN, ACK ] immediatlyRPC clnt_call 立即发送 tcp [ FIN, ACK ]
【发布时间】:2015-08-18 07:14:07
【问题描述】:

我在 VM 上使用 CentOS 6.5 编程,用 C 编写代码

我打了个电话

client_status = clnt_call( clnt, NFSPROC3_GETATTR, 
                          (xdrproc_t)xdr_GETATTR3args, (caddr_t)&args,
                          (xdrproc_t)xdr_GETATTR3res, (caddr_t)&result, TIMEOUT);

其中 clnt 是我创建一次使用 clnt_call 并保留它以供下一次调用的客户端(而不是为每个调用创建一个新的)

  • 我仍然没有意识到触发它的原因是什么,但偶尔我会收到一条消息“RPC:无法接收”,随后会破坏客户端并创建一个新客户端进行重新传输 - 这始终有效。
  • 当使用 tcpdump 观察实际发生的情况时,我看到的是在 NFSPROC3_GETATTR 发送后(包含所有正确信息),60 微秒后客户端发送 TCP [FIN, ACK] 消息。

    • 也许 tcp dump 在中间丢弃了一些数据包(但我对此表示怀疑)

什么会导致连接出现这种情况? 我尝试查看 clnt_calls 和 Authenticator 之间的变化保持不变,所有信息保持不变,但可能长时间不活动会使服务器失去连接,只能通过创建新客户端来解决。

【问题讨论】:

    标签: sockets tcp client rpc nfs


    【解决方案1】:

    客户端在 clnt_call 失败后发送 FIN 的原因是因为他被扔到 clnt_destroy 并被重新创建以重试

    我首先收到错误的原因是因为在 6 分钟以上的空闲时间之后,服务器将 FIN 发送给客户端并且他返回 ACK,但仍然表现得好像连接处于活动状态 - 给我们留下了 half open tcp 连接

    因此,当我尝试发送消息时,我收到了一个 RPC 错误 - 无法接收 - 因为对方没有在监听(服务器已经断开连接)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-09
      • 1970-01-01
      • 1970-01-01
      • 2013-08-11
      • 2011-04-21
      • 1970-01-01
      • 1970-01-01
      • 2016-09-19
      相关资源
      最近更新 更多