Почему 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 минут ОС по-прежнему будет зависать без успешного чтения. Если вы действительно хотите сохранить соединение вечным, вы можете установить опцию сокета.