2010-04-01 6 views
1

웹 서버가있는 iPhone 응용 프로그램을 작성하고 있습니다. 웹 요청을 처리하기 위해 웹 요청을 받아서 다시 보내려는 데이터를 write()합니다.write()는 파일 이름이 잘못되었을 때 치명적인 오류를 발생시킵니다.

중간 크기의 파일 (3-6MB)을 다운로드하려고하면 제대로 작동하지만 다운로드가 중간에 취소되면 앱이 다운되고 오류가 표시되지 않습니다. 나는 파일 디스크립터가 쓰기를 통해 중간에 무너져서 충돌을 일으킨다 고 생각하고있다. 나는 이것이 충돌을 일으키는 원인이되는지 진짜로 모른다, 나는 다만 추측하고있다.

저는 웹 서버가 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 신호를 수신하고있는 것 같습니다. 나는 당신이 당신의 main() 함수의 상단에이 작업을 수행하는 것이 좋습니다

#include <signal.h> 

signal (SIGPIPE, SIG_IGN); 

: 당신은 같은 것을 사용하여, 코드에서 SIGPIPE 신호를 무시해야합니다.

또한, 당신은 그들이 비동기 작업을 할 수 있도록 실행 루프를 사용 할 수 있기 때문에, NSInputStream/NSOutputStream 또는 코어 재단의 대응, CFReadStream/CFWriteStream를 사용하여 더 나을 수 있습니다.

관련 문제