Почему GCDAsyncSocket всегда отключает тайм-аут чтения подставок?

Я просмотрел 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]];
        }
    }
}

FYI, есть запрос на перенос на https://github.com/robbiehanson/CocoaAsyncSocket/pull/126 , который добавляет эту функцию keep-alive, но она еще не вытащена.

5
nl ja de

1 ответы

Я являюсь оригинальным автором AsyncSocket, и я могу сказать вам, почему я так сделал: слишком много способов протоколов для обработки тайм-аутов. Поэтому я реализовал «жесткий» тайм-аут и оставил «мягкие» таймауты до автора приложения.

Обычным способом «мягкого» тайм-аута является NSTimer или dispatch_after . Установите один из них, и когда срабатывает таймер, сделайте все, что вам нужно. Между тем, используйте бесконечный тайм-аут для фактического вызова readData . Обратите внимание, что бесконечные таймауты на самом деле не бесконечны. ОС по-прежнему будет тайм-аут после, скажем, 10 минут без успешного чтения. Если вы действительно хотите поддерживать связь навсегда, вы можете установить опцию сокета.

13
добавлено
Чтобы сделать это, вы имеете в виду, что я вызываю фактический readData с бесконечным таймаутом внутри кода, когда срабатывает мой мягкий тайм-аут NSTimer или dispatch_after ? Всего лишь уточняю :)
добавлено автор Hlung, источник
Ах, спасибо за это. Если возможно, не могли бы вы привести мне пример этого репо? Я сделал google, но там много, и их описание выглядит одинаково. : /
добавлено автор Hlung, источник
nvm, я реализовал мягкий тайм-аут самостоятельно. Это не так сложно. В конце концов, я начинаю понимать, что мягкий тайм-аут - это способ, которым должен работать сокет, и выбрасывать все мои коды keep-alive. Еще раз спасибо!
добавлено автор Hlung, источник
Нет, я имел в виду фактический readData с бесконечным таймаутом, но в то же время настраивал NSTimer или dispatch_after для запуска после мягкого тайм-аут. Но я замечаю, что более свежие версии AsyncSocket (расширенные и поддерживаемые другими) имеют делегатский вызов, разработанный, чтобы облегчить вам мягкие тайм-ауты.
добавлено автор Dustin Voss, источник
Mobile Dev Jobs — вакансии и аналитика
Mobile Dev Jobs — вакансии и аналитика
6 187 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin и т.д. ВАЖНО: Правила публикации и правила канала: Ссылка – https://telegra.ph/Pravila-oformleniya-vakansij-i-rezyume-11-09-2

iOS Developers — русскоговорящее сообщество
iOS Developers — русскоговорящее сообщество
2 400 участник(ов)

Общаемся на темы, посвященным iOS-разработке, Swift, Objective-C, SDK, Rx, Cocoa и т.д.