2012-01-18 30 views
1

我已经实现了从Windows桌面应用程序到iPhone App的客户端 - 服务器传输。我使用NSStream以轮询模式(同步)传输数据。防止使用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方法中。

请问有人可以帮助我吗?

回答

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秒)才能解析为状态错误。

+0

谢谢,但我已经尝试过......没有区别。在所有情况下,streamStatus = 1和streamError =空字符串。 – Gigi 2012-01-19 07:24:37

+0

是的,1的streamStatus意味着它没有准备好使用。查看我的编辑了解更多信息。 – MechEthan 2012-01-19 17:10:03

+0

太棒了,它完美的工作!非常感谢你! – Gigi 2012-01-20 11:05:31

相关问题