正确运行几天后,solaris中的TCP套接字recv超时[8 - 15天]为什么?

时间:2011-11-25 15:56:15

标签: c sockets networking tcp network-programming

我们在C,Solaris平台上实现了一个SFTP客户端应用程序。 该应用程序正常工作几天,之后,套接字操作[recv]失败 超时后,我们将超时设置为120秒[2分钟]。

重启过程后,一切正常。

我想知道的是:

  1. 如何检查TCP错误的根本原因是什么? errno即将出现150 /一段时间超时错误
  2. 从系统日志文件中从哪里获取TCP错误的原因?在Solaris机器
  3. 请提供一些建议,以便找到此问题的根本原因。

2 个答案:

答案 0 :(得分:0)

你也控制服务器端吗?服务器一直在运行吗?您是否可能与2台或更多服务器进行交互?如果是最后一个,则您的ARP缓存可能已记录了与工作服务器不再对应的条目。如果您控制服务器,请让他们在启动时发送免费ARP请求。我不知道为solaris做了多少,但这听起来像是一个ARP问题,你可以用tcpdump进行监控。

答案 1 :(得分:0)

据我所知,Solaris errno 150引用了EINPROGRESS,可能会被connect()调用设置。

我不确定recv()是否可能将errno设置为EINPROGRESS,至少它不在Linux上。因此,在查看recv()时,您可能会走错路。

无论如何通过EINPROGRESS将错误号设置为connect()并不一定表示错误,而是根据预期的速度以某种方式表示连接过程的异常行为。

有关如何处理此类情况的详细信息,请参阅connect()手册页。

由于connect()的Linux手册页告诉我们的不仅仅是Solaris,因此我引用了第一篇:

  

EINPROGRESS套接字是非阻塞的,无法立即完成连接。通过选择用于写入的套接字,可以选择(2)或轮询(2)以完成。在select(2)表示可写性之后,使用getsockopt(2)读取SOL_SOCKET级别的SO_ERROR选项以确定connect()是否成功完成(SO_ERROR为零)或失败(SO_ERROR是此处列出的常见错误代码之一,解释了失败的原因)。