#sockets #network-programming #ibm-midrange
#сокеты #сетевое программирование #ibm-средний уровень
Вопрос:
Я запускаю серверную программу, написанную на C, работающую на PASE на компьютере iSeries. PASE (Portable AIX Solutions Environment) — это имитация AIX на компьютерах IBM iSeries.
Серверная программа представляет собой итеративный tcp-сервер, ориентированный на подключение.
Логика сервера содержит вызов accept(), который возвращает дескриптор сокета. За этим следует вызов ioctl(), чтобы установить неблокирующий сокет с помощью F_IONBIO.
Этот вызов ioctl периодически завершается ошибкой, возвращает -1 с errno = 9 (EBADF: неверный файловый дескриптор), примерно в 0,8% случаев, когда он вызывается. После сбоя для определенного дескриптора сокета следующие сбои всегда происходят для того же дескриптора сокета и с тем же errno.
Когда это происходит, на стороне клиента происходит сбой с errno = 73, т.е. соединение сбрасывается одноранговым узлом.
Сервер является демоническим процессом; поэтому stdin закрывается при инициализации и доступен с помощью accept(). Изначально я заметил, что ioctl () не удался для дескриптора сокета 0, но не всегда. Следовательно, я пытался предотвратить повторное использование дескриптора сокета 0, установив stdin в ‘/ dev / null’, на случай, если это было проблемой. Но я не уверен, что это было основной проблемой. Пока не получены результаты тестирования после этого изменения.
Проблема наблюдалась только на некоторых компьютерах, и обычно при загрузке компьютера. Похоже, это какое-то условие гонки. Логика сервера хорошо протестирована и, похоже, стабильна.
Наблюдались ли какие-либо проблемы, связанные с сокетами, на платформе PASE или AIX? Может ли это быть связано с операционной системой?
Будем признательны за любую помощь / указания по этой проблеме.
заранее спасибо,
среднее значение
Ответ №1:
Есть ли вероятность, что вы сталкиваетесь с максимальным значением по умолчанию в 200 файловых дескрипторов на задание?
Если это так, вы можете использовать DosSetRelMaxFH() — Измените максимальное количество файловых дескрипторов API, чтобы увеличить ограничение.
Если проблема не в этом, я предлагаю собрать и изучить трассировку связи SST с ошибкой. Смотрите Инструкции по трассировке связи TCP / IP для получения дополнительной информации.
Далее я бы проверил уровни PTF группы, особенно SF99315 PTF группы TCP / IP.
Служба поддержки IBM действительно помогает в устранении подобных проблем.
Комментарии:
1. Небольшое примечание — В PASE значение по умолчанию должно быть 2000 . Значение QShell по умолчанию равно 200.