¿Por qué GCDAsyncSocket siempre desconecta después del time de espera de lectura?

Miré en GCDAsyncSocket.m en el código que maneja el time de espera de lectura. Si no extiendo el time de espera, parece que el socket se cerró y no hay ninguna opción para mantener el socket vivo. No puedo usar el time de espera infinito (timeout = -1) porque todavía necesito saber cuándo se agota el time de espera, pero tampoco quiero que se desconecte. No estoy seguro de que haya una razón detrás de esto. ¿Alguien sabe?

- (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]]; } } } 

Para su información, hay una request de extracción en https://github.com/robbiehanson/CocoaAsyncSocket/pull/126 que agrega esta característica keep-alive pero aún no se ha extraído.

Soy el autor original de AsyncSocket, y puedo decirte por qué lo hice de esa manera: hay demasiadas maneras en que los protocolos manejan los times de espera. Así que implementé un time de espera "duro" y dejé times de espera "suaves" hasta el autor de la aplicación.

La forma habitual de hacer un time de espera "suave" es con un NSTimer o dispatch_after . Establezca uno de esos, y cuando el timer dispare, haga lo que necesite hacer. Mientras tanto, use un time de espera infinito en la llamada real de readData . Tenga en count que los times de espera infinitos no son realmente infinitos. El sistema operativo aún expirará después de, digamos, 10 minutos sin leer correctamente. Si realmente desea mantener viva la connection para siempre, es posible que pueda establecer una opción de socket.