作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我在 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 并将其保留用于下一次调用(而不是为每次调用创建一个新的)
当使用 tcpdump 观察实际发生的情况时,我看到在发送 NFSPROC3_GETATTR(包含所有正确信息)后,60 微秒后,客户端发送一条 TCP [FIN, ACK] 消息。
什么会导致连接像这样?我已经尝试查看 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/
我在 VM 上的 CentOS 6.5 中编程,用 C 编写代码 我打电话 client_status = clnt_call( clnt, NFSPROC3_GETATTR,
我是一名优秀的程序员,十分优秀!