Здравствуйте. Я уже не знаю что делать, стоять на голове или поверить в магию? Тестирую сервер написанный на сокетах беркли + событийный epoll(edge-triggered), сокеты не блокируемые, запросы обрабатываются в одном потоке, ядро системы linux-4.9.0-8-686-pae. Пока боролся с проблемой, весь код раздел, остался "скелет", так что запутаться сложно, хотя и изначально все было отточено, но блин..., хреновое лезвие получилось). В общем запускаю сервер, на этом же компе запускаю клиента(клиент создает несколько tcp-соединений через них и задает запросы, получает ответы), делаю порядка 100-200 запросов и ответов. С начала все ок(10-20 запросов без глюков), но с каждым новым запросом клиент начинает подвисать (как будто не достаточно данных пришло). Последние запросы вообще начинаются установкой tcp-соединения и сбросом со стороны сервера так как номер события epoll говорит что надо разъединяться и это в лучшем случае, в худшем, сервер пишет, пишет, пишет, а потом падает на функции write() при том что количество записанных байт перед падением всегда равно 21888 (на ответах разной длины)? Проверил все библиотечные функции на ошибки все работает правильно, смотрел errno после крашного write(), все по нулям. Что за фиговина)? Дайте хоть какую то пищу для размышления, а то прямо не знаю что думать.
Дайте хоть какую то пищу для размышления, а то прямо не знаю что думать.
Происходит переполнение чего-то. Возможно, новые соединения не успевают устанавливаться или старые закрываются недостаточно быстро. Возможно переполняются некие ядерные буфера. Но на факт, что это переполнение чего-то указывает характер ошибки - сначала быстро, потом медленнее и медленнее и потом бэмц.
Сталкивался с подобным в Windows NT. Если память мне не изменяет, то чтобы всё работало, сервер при ответе должен порождать новый процесс, который и будет отвечать клиенту.