У меня периодически возникает проблема с сервером на основе telnet в Unix (проблема возникает как в AIX, так и в Linux).Сервер открывает два сокета, один для сеанса telnet клиента, а другой - для программы, работающей на той же машине, что и сервер.Идея состоит в том, что данные передаются через сервер в эту программу и из нее.
В текущей настройке есть цикл, использующий select для ожидания доступа к дескриптору файла «read», а затем select для ожиданиядескриптор файла «write» станет доступным.
Затем программа считывает из дескриптора входящего файла, затем обрабатывает данные перед записью в исходящий дескриптор.
Фрагмент ниже показывает, что происходитна.Проблема в том, что очень редко происходит сбой чтения, когда errno устанавливается в ECONNRESET или ETIMEDOUT.Ни один из этих кодов не документирован чтением, так откуда они берутся?
Реальный вопрос в том, как я могу остановить это или изящно справиться с этим?Могут ли быть проблемы с двумя выборами подряд?
Текущее поведение обработки - выключение и перезапуск.Следует отметить, что, как только это происходит, обычно это происходит три или четыре раза, а затем проясняется.На самом деле нагрузка на систему не такая высокая (это большой сервер).
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;
}
}