防止在轮询模式下使用NSStream停止应用程序

时间:2012-01-18 22:28:53

标签: objective-c asynchronous timeout nsstream blocked

我已经实现了从Windows桌面应用程序转移到iPhone App的客户端 - 服务器。我在轮询模式下使用NSStream传输数据(同步)。

CFReadStreamRef readStream;
CFWriteStreamRef writeStream;

CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)urlStr, portNo, &readStream, &writeStream);

inputStream = (NSInputStream *)readStream;
outputStream = (NSOutputStream *)writeStream;

[inputStream open];
[outputStream open];

一切正常,但是当我尝试连接不存在的服务器或断开连接的服务器或端口号/ IP地址错误时,NSOutputStream对象的WRITE方法会停止应用程序的执行。

const uint8_t *str = (uint8_t *) [strRichiesta cStringUsingEncoding:NSASCIIStringEncoding];
[outputStream write:str maxLength:strlen((char*)str)]; 

是否可以通过插入超时控制来管理方法? 如果是,我该怎么办?

我认为NSInputStream对象的READ方法也会出现同样的问题。

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:2)

检查NSStream s'streamStatusstreamError功能,然后再尝试使用它们进行读写。有关详细信息,请参阅Apple的NSStream Documentation

这也可能有所帮助:Setting Up Socket Streams

修改: NSStreamStatus值:

typedef enum {
    NSStreamStatusNotOpen = 0,
    NSStreamStatusOpening = 1,
    NSStreamStatusOpen = 2,
    NSStreamStatusReading = 3,
    NSStreamStatusWriting = 4,
    NSStreamStatusAtEnd = 5,
    NSStreamStatusClosed = 6,
    NSStreamStatusError = 7
};

在使用之前,您必须等到状态为“打开”。可能需要几秒钟(甚至30秒)才能将错误的URL解析为状态错误。