Есть приложение, которое общается с сервером по TCP. Протокол представляет собой просто запрос-ответ, плюс ещё клиент и сервер отправляют друг другу пинги.
Клиент в бесконечном цикле дёргает read()
из сокета, который переведёт в неблокирующий режим.
Проблема в том, что через некоторое время случается так, что клиент не вычитывает ответ, пока не придёт очередной пинг от сервера. То есть, read()
всё это время возвращает -1, errno=EAGAIN.
В tcpdump видно, что ответ пришёл вовремя (сразу после запроса). А также видно, что в тот момент, когда клиент наконец-то вычитал, пришёл следующий пакет (пинг).
Проблемы в приложении исключили, запускали под strace, постоянно пытается вычитать новые данные, но ядро их не отдаёт.
В какую сторону копать?