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