Страницы

Поиск по вопросам

суббота, 11 апреля 2020 г.

Возникновение сигнала SIGPIPE (ошибка EPIPE) при обращении из браузера Android устройства

#cpp #android #сокет #http #tcp_ip

                    
Написал демон на С++ (Линукс). Он слушает запросы от устройства на Android. 

Причем сделал универсально: в браузере на Android в адресной строке указывается IP-адрес/сайт
(на котором слушает демон), и сам демон посылает в ответ файл, который сохраняется
в браузере.

Использую неблокирующие сокеты, TCP и т.д.

Спустя некоторое время после начала отправки файла приходит ошибка EPIPE (errno =
32 - Broken pipe). После этой ошибки я закрываю сокет.

Не знаю как будет работать на других Android телефонах, но мой делает повторный запрос
и скачивает файл со второго раза без ошибки EPIPE. Боюсь, что на других телефонах файл
просто не скачается.

Если я проделываю то же самое со своего компьютера, то никаких ошибок EPIPE не возникает.

Хотелось бы разобраться почему так происходит.
    


Ответы

Ответ 1



Ошибка EPIPE возвращается обычно в том случае, если данный сокет никем не читается, тоесть нет ни одного процесса, имеющего открытый на чтение дескриптор, связанный с этим сокетом. Возможна ситуация, что Ваш клиент на Андроид по каким-то причинам закрыл дескриптор на чтение, связанный с этим сокетом, тогда, по идее, Вы должны были бы в демоне получить сигнал SIGPIPE и как-то обработать эту ситуацию. Если же вы игнорируете SIGPIPE, то вызов write() обязан вернуть вам EPIPE.

Ответ 2



Разобрался... Потратил кучу времени, чтобы выяснить - просто так на моём китайском телефоне (хотя вроде хуавей хвалят) работает браузер... в нете попадается информация, что стандартный загрузчик на Андроиде (особенно ниже 3.х) с ошибками скачивает файлы, и предлагается установить альтернативный браузер со встроенным менеджером загрузок, может Вам тоже этот подход попробовать? – margosh

Ответ 3



Эта ошибка возникает на всех линуксах, при работе с сокетами. Лечится вызовом signal(SIGPIPE, SIG_IGN);

Комментариев нет:

Отправить комментарий