【问题标题】:Why GCDAsyncSocket always disconnect afters read timeout?为什么 GCDAsyncSocket 在读取超时后总是断开连接?
【发布时间】:2013-02-07 11:24:14
【问题描述】:

我在处理读取超时的代码中查看了 GCDAsyncSocket.m。如果我不延长超时,似乎套接字已关闭,并且套接字活动保持没有选项。我不能使用无限超时(timeout = -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 有一个拉取请求,它添加了此保持活动功能,但尚未拉取。

【问题讨论】:

    标签: ios objective-c tcp cocoaasyncsocket


    【解决方案1】:

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

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

    【讨论】:

    • 所以要做到这一点,你的意思是当我的软超时NSTimerdispatch_after 触发时,我已经调用了实际的readData 并在代码内无限超时?只要确保:)
    • 不,我的意思是使用无限超时执行实际的readData,但同时设置NSTimerdispatch_after 在软超时后触发。但我注意到 AsyncSocket 的最新版本(由其他人扩展和维护)有一个委托调用,旨在让您以更简单的方式进行软超时。
    • 啊,谢谢指出。如果可能的话,你能给我一个这些回购的例子吗?我确实谷歌了它,但那里有很多,它们的描述看起来一样。 ://
    • nvm,我自己实现了软超时。这并不难。毕竟,我开始意识到软超时是套接字应该工作的方式并丢弃我所有的保活代码。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2012-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-09
    • 1970-01-01
    • 1970-01-01
    • 2017-10-22
    相关资源
    最近更新 更多