我在Unix上遇到基于telnet的服务器的间歇性问题(问题出现在AIX和Linux上)。 服务器打开两个套接字,一个用于客户端telnet会话,另一个用于与服务器在同一台机器上运行的程序。这个想法是数据通过服务器传入和传出这个程序。
当前设置有一个循环,使用select等待“读取”文件描述符变为可用,然后使用select等待“写入”文件描述符变为可用。
然后程序从传入的文件描述符读取,然后在写入传出描述符之前处理数据。
下面的代码段显示了正在发生的事情。问题是,有时读取失败,错误被设置为ECONNRESET或ETIMEDOUT。这些都不是由read记录的代码,那么它们来自哪里?
真正的问题是,我怎样才能阻止这种情况发生,或者优雅地处理它? 可以连续选择两个问题吗?
当前的处理行为是关闭并重新启动。需要注意的一点是,一旦发生这种情况,通常会发生三到四次,然后清除。系统负载似乎并不高(它是一个大服务器)。
if (select(8, &readset, NULL, NULL, NULL) < 0)
{
break;
}
if (select(8, NULL, &writeset, NULL, NULL) < 0)
{
break;
}
if (FD_ISSET(STDIN_FILENO, &readset)
&& FD_ISSET(fdout, &writeset))
{
if ((nread = read(STDIN_FILENO, buff, BUFFSIZE)) < 0)
{
/* This sometimes fails with errno =
ECONNRESET or ETIMEDOUT */
break;
}
}
答案 0 :(得分:0)
查看第85和98行http://lxr.free-electrons.com/source/arch/mips/include/asm/errno.h中的评论:这些基本上表示网络连接重置或超时。检查并查看是否有超时可以在远程网络程序上进行调整,或者发送一些定期填充字节以确保连接始终保持清醒状态。您可能只是远程客户端和本地服务器之间的网络传输路径中的错误的受害者(当我的DSL线路打嗝时,这种情况发生在我身上)。
编辑:不确定downvote的用途。 man page for read明确说:
可能会发生其他错误,具体取决于连接到fd的对象。
错误可能发生在select
,而不是read
:你没有在select
之后检查错误,你只是前进到read
},如果select
返回错误,则会失败。我打赌如果您在select
电话后检查错误值,您会看到错误:您无需等待read
看到错误。