Я некоторое время являюсь c-кодером - ни новичком, ни экспертом. Теперь у меня есть определенное демоническое приложение на C на PPC Linux. Я использую PHP socket_connect в качестве клиента для локального подключения к этому сервису. Сервер использует epoll для мультиплексирования соединений через сокет Unix. Переданная пользователем строка анализируется для определенных символов / слов с помощью strstr () и, если она найдена, порождает 4 присоединяемых потока на разных веб-сайтах одновременно. Я использую socket, connect, write и read, чтобы взаимодействовать с указанными веб-серверами через TCP через их порт 80 в каждом потоке. Все соединения и записи кажутся успешными. Однако чтение на сокеты веб-сервера завершается неудачно: либо (A) все 3 потока кажутся зависшими, и только один поток возвращает -1, а значение errno равно 104. Отвечающий поток занимает около 10 минут - вечность :-(. * Я где-то читал, что 104 (EINTR?), Который в контексте сети предполагает, что ... «соединение было сброшено равноправным узлом», или (B) 0 байтов из 3 потоков, и только 1 из 4 потоков фактически возвращает некоторые данные. Разве сокет не предназначен для чтения / записи потокобезопасным? Я использую поточно-ориентированные (и повторно входящие) функции libc, такие как strtok_r, gethostbyname_r и т. д.
* Я сомневаюсь, что указанные веб-хосты на самом деле сбрасывают соединение, потому что когда я запускаю однопоточный автономный (при прочих равных условиях) все работает идеально, но, конечно, последовательно, а не параллельно.
Есть и вторая проблема (упс), я не могу написать обратно клиенту, который подключается к моему epoll-ed Unix-сокету. Мое приложение-демон будет зависать и загружать процессор> 100% навсегда. Пока ничего не написано для клиентов. Я уверен, что клиент (очень типичное PHP-приложение для сокетов) не закрывал соединение, когда это происходит - ошибки не обнаружены. Есть идеи?
Я не могу понять, что не так, даже с Valgrind, GDB или большим количеством логов. Пожалуйста, помогите, где вы можете.