5

読み取りタイムアウトを処理するコードで 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にプル リクエストがありますが、まだプルされていません。

4

1 に答える 1

14

私はAsyncSocketの最初の作成者であり、なぜそのようにしたのかを説明できます。プロトコルがタイムアウトを処理する方法が多すぎます。そこで、「ハード」タイムアウトを実装し、「ソフト」タイムアウトをアプリケーションの作成者に任せました。

「ソフト」タイムアウトを実行する通常の方法は、NSTimerまたはを使用することdispatch_afterです。それらの1つを設定し、タイマーが起動したら、必要なことをすべて実行します。その間、実際のreadData呼び出しで無限のタイムアウトを使用します。無限のタイムアウトは実際には無限ではないことに注意してください。OSは、たとえば10分経っても、正常に読み取れずにタイムアウトします。本当に接続を永久に維持したい場合は、ソケットオプションを設定できる可能性があります。

于 2013-02-28T18:53:35.663 に答える