为什么GCDAsyncSocket总是在读取超时后断开连接?

时间:2013-02-07 11:24:14

标签: ios objective-c tcp cocoaasyncsocket

我在处理读取超时的代码中查看了GCDAsyncSocket.m。如果我没有延长超时,似乎套接字已关闭,并且套接字没有选项保持。我不能使用无限超时(超时= -1),因为我仍然需要知道它何时超时,但也不希望它断开连接。我不确定这背后有什么原因。有谁知道吗?

- (void)doReadTimeoutWithExtension:(NSTimeInterval)timeoutExtension
{
    if (currentRead)
    {
        if (timeoutExtension > 0.0)
        {
            currentRead->timeout += timeoutExtension;

            // Reschedule the timer
            dispatch_time_t tt = dispatch_time(DISPATCH_TIME_NOW, (timeoutExtension * NSEC_PER_SEC));
            dispatch_source_set_timer(readTimer, tt, DISPATCH_TIME_FOREVER, 0);

            // Unpause reads, and continue
            flags &= ~kReadsPaused;
            [self doReadData];
        }
        else
        {
            LogVerbose(@"ReadTimeout");

            [self closeWithError:[self readTimeoutError]];
        }
    }
}

仅供参考,https://github.com/robbiehanson/CocoaAsyncSocket/pull/126有一个拉取请求,它会添加此保持活动功能,但尚未提取。

1 个答案:

答案 0 :(得分:14)

我是AsyncSocket的原作者,我可以告诉你为什么我这样做:协议处理超时的方法太多了。因此,我实施了一个“硬”超时,并将“软”超时留给应用程序作者。

执行“软”超时的常用方法是使用NSTimerdispatch_after。设置其中一个,当计时器触发时,做你需要做的任何事情。同时,在实际readData调用上使用无限超时。请注意,无限超时实际上并不是无限的。在没有成功阅读的情况下,操作系统仍会在10分钟后超时。如果你真的希望永远保持连接,你可以设置一个套接字选项。