【问题标题】:Prevent stops application with NSStream in polling mode防止在轮询模式下使用 NSStream 停止应用程序
【发布时间】:2012-02-13 15:57:00
【问题描述】:

我已经实现了从 Windows 桌面应用程序到 iPhone 应用程序的客户端-服务器传输。我使用 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 方法也会出现同样的问题。

有人可以帮帮我吗?

【问题讨论】:

    标签: objective-c asynchronous timeout nsstream blocked


    【解决方案1】:

    检查NSStreams'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
    };
    

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

    【讨论】:

    • 谢谢,但我已经尝试过了……没区别。在所有情况下 streamStatus=1 和 streamError=empty 字符串。
    • 是的,streamStatus 为 1 意味着它还没有准备好使用。有关更多信息,请参阅我的编辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-14
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-29
    相关资源
    最近更新 更多