2010-04-01 1 views
1

Я пишу приложение iPhone с веб-сервером. Чтобы обрабатывать веб-запрос, я беру веб-запрос и пишу() ему данные, которые я хочу отправить обратно.write() вызывает фатальный сбой, когда filedescriptor становится недействительным

Когда я пытаюсь загрузить файл умеренного размера (3-6 МБ), он отлично работает, но если я отменил загрузку на полпути, приложение выйдет из строя и не оставляет следов ошибки. Я думаю, что дескриптор файла становится недопустимым на полпути через запись и вызывает сбой. Я действительно не знаю, является ли это причиной аварии, я просто предполагаю.

Я основываю свой веб-сервер на this.

NSString *header = @""; 
NSData *data = [NSData dataWithContentsOfFile:fullPath]; 
write (fd, [header UTF8String], [header length]); 
write(fd, [data bytes], [data length]); 
close(fd); 

Кто-нибудь знает, как это исправить? Я думал о том, чтобы разбить данные, а затем написать каждую часть, но я не думаю, что это поможет.

+1

Какой код вы используете, чтобы остановить скачивание? Вы пытались запустить приложение в отладчике, чтобы поймать сбой? – codewarrior

+0

Зачем предполагать что-нибудь? У вас есть инструменты, которые помогут вам определить краш-точку. По крайней мере, вы должны иметь обратную линию. Запустите приложение в отладчике и посмотрите, где он сбой. – bbum

ответ

2

Похоже, что ваше приложение, вероятно, получает сигнал SIGPIPE в результате попытки записи в сломанный сокет. Вам нужно будет игнорировать SIGPIPE сигнал в коде, используя что-то вроде:

#include <signal.h> 

signal (SIGPIPE, SIG_IGN); 

я предлагаю, что вы делаете это в верхней части main() функции.

Кроме того, вы можете быть лучше использовать NSInputStream/NSOutputStream или их аналоги ядра Foundation, CFReadStream/CFWriteStream, так как они могут быть сделаны, чтобы использовать разбег петлю, чтобы асинхронной операции.

Смежные вопросы