Почему 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]];
        }
    }
}

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

1 ответ

Решение

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

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

Другие вопросы по тегам