2010-04-01 43 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,因为它们可以进行使用运行循环允许异步操作会更好。