当filedescriptor变得无效时,write()会导致致命的崩溃

时间:2010-04-01 00:36:55

标签: iphone objective-c crash

我正在编写一个带有网络服务器的iPhone应用程序。为了处理Web请求,我接受Web请求并将()向其写入我想要发回的数据。

当我尝试下载中等大小的文件(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 个答案:

答案 0 :(得分:2)

听起来您的应用程序可能因为尝试写入损坏的套接字而收到信号SIGPIPE。您需要使用以下内容忽略代码中的SIGPIPE信号:

#include <signal.h>

signal (SIGPIPE, SIG_IGN);

我建议您在main()功能的顶部执行此操作。

此外,您可能最好使用NSInputStream / NSOutputStream或其核心基金会对应人员CFReadStream / CFWriteStream,因为他们可以使用循环以允许异步操作。