2010-04-01 63 views
1

我正在寫一個帶有web服務器的iPhone應用程序。爲了處理一個Web請求,我接收了Web請求並將它寫入()給我,以便將我想要發回的數據寫入它。當filedescriptor變爲無效時,write()會導致致命的崩潰

當我嘗試下載一箇中等大小的文件(3-6MB)它工作正常,但如果我取消下載到一半,應用程序崩潰,不留一個錯誤的軌跡。我在考慮文件描述符在寫入中途變得無效,並導致崩潰。我真的不知道這是導致墜機的原因,我只是假設。

我立足我的web服務器關閉this例子。

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

有誰知道如何解決這個問題?我正在考慮分塊數據,然後寫每個部分,但我認爲這不會有幫助。

+1

你用什麼代碼來停止下載?您是否嘗試在調試器中運行應用程序來捕捉崩潰? – codewarrior 2010-04-01 02:05:14

+0

爲什麼假設任何事情?你有工具來幫助你識別崩潰點。至少應該有一次回溯。在調試器中運行您的應用程序,並查看它崩潰的位置。 – bbum 2010-04-01 03:27:29

回答

2

這聽起來像您的應用程序可能接收到信號SIGPIPE因爲試圖寫入一個破插座的結果。您需要忽略在代碼中SIGPIPE信號,使用類似:

#include <signal.h> 

signal (SIGPIPE, SIG_IGN); 

我建議你在你的main()函數的頂部做到這一點。

此外,您可以使用NSInputStream/NSOutputStream或他們的核心基礎同行,CFReadStream/CFWriteStream,因爲它們可以進行使用運行循環允許異步操作會更好。