#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);
Комментариев нет:
Отправить комментарий