我们在C,Solaris平台上实现了一个SFTP客户端应用程序。 该应用程序正常工作几天,之后,套接字操作[recv]失败 超时后,我们将超时设置为120秒[2分钟]。
重启过程后,一切正常。
我想知道的是:
errno
即将出现150 /一段时间超时错误答案 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是此处列出的常见错误代码之一,解释了失败的原因)。