Я запускаю серверную программу, написанную на 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? Может ли это быть связано с ОС?
Буду признателен за любую помощь/указания по этой проблеме.
заранее спасибо,
среднее