gpt4 book ai didi

sockets - RPC clnt_call 立即发送 tcp [FIN, ACK]

转载 作者:可可西里 更新时间:2023-11-01 02:54:13 24 4
gpt4 key购买 nike

我在 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 之间的变化保持不变并且所有信息保持不变,但可能长时间不活动会使服务器失去连接并且只能通过创建新客户端来解决。

最佳答案

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

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

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

关于sockets - RPC clnt_call 立即发送 tcp [FIN, ACK],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32065908/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com