Сетевая ошибка в PASE на компьютере iSeries

#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.