Выберите и прочитайте сокеты (Unix) - PullRequest
1 голос
/ 29 августа 2011

У меня периодически возникает проблема с сервером на основе 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;
                        }
                }

1 Ответ

0 голосов
/ 29 августа 2011

Посмотрите на комментарии в http://lxr.free -electrons.com / source / arch / mips / include / asm / errno.h в строках 85 и 98: они в основном говорят, что произошел сброс сетевого подключенияили тайм-аут.Проверьте и посмотрите, есть ли таймауты, которые вы можете настроить в удаленной сетевой программе, или отправьте несколько периодических байтов-заполнителей, чтобы убедиться, что соединение постоянно просыпается.Вы можете просто стать жертвой ошибки в пути сетевого транзита между удаленным клиентом и вашим локальным сервером (это случается со мной, когда происходит сбой в моей линии DSL).

РЕДАКТИРОВАТЬ: не уверен, для чего предназначен понижающий голос.Справочная страница для чтения прямо говорит:

Могут возникнуть другие ошибки, в зависимости от объекта, подключенного к fd.

Возможно, ошибка возникаетв select, а не в read: вы не проверяете ошибки после select, вы просто переходите к read, который завершится ошибкой, если select вернул ошибку.Держу пари, если вы проверите значение errno после вызова select, вы увидите ошибки: вам не нужно ждать read, чтобы увидеть ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...