ios - ¿Por qué GCDAsyncUdpSocket no puede enviar/recibir paquetes después de un tiempo en el modo de difusión?
objective-c broadcast (1)
Estoy usando GCDAsyncUdpSocket
para escribir un socket UDP en mi aplicación. El escenario es así: cuando los usuarios hacen clic en el botón, envían un paquete de difusión en LAN y luego escuchan la respuesta, hay un servidor en LAN que responderá con un paquete UDP. Cuando la aplicación recibe la respuesta, hará algo.
Establecí GCDAsyncUdpSocket
siguiente manera:
- (void)setupSocket
{
_udpSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
NSError *error = nil;
if (![_udpSocket bindToPort:18686 error:&error]) {
NSLog(@"Error binding: %@",error);
return;
}
if (![_udpSocket beginReceiving:&error]) {
NSLog(@"Error receiving: %@",error);
return;
}
if (![_udpSocket enableBroadcast:YES error:&error]) {
NSLog(@"Error enableBroadcast: %@",error);
return;
}
}
luego envío Packet in button action de la siguiente manera:
NSString *host = @"255.255.255.255";
int port = 8585;
NSString *msg = @"Hello from iOS";
NSData *data = [msg dataUsingEncoding:NSUTF8StringEncoding];
[_udpSocket sendData:data toHost:host port:port withTimeout:-1 tag:0];
en
- (void)udpSocket:(GCDAsyncUdpSocket *)sock didReceiveData:(NSData *)data
fromAddress:(NSData *)address
withFilterContext:(id)filterContext
método, escucho el puerto para hacer algunas cosas. Funciona perfectamente al principio, pero si intenta hacer clic en el botón más tarde (alrededor de 1 hora), ya no puede enviar paquete UDP.
Mi servidor en LAN imprimirá los datos recibidos. Pensé que había algo mal con el método de envío. así que uso los métodos de socket BSD para enviar los datos. y use GCDAsyncUdpSocket
para recibir la respuesta. pero lo mismo sucedió después de un tiempo. esta vez puedo enviar pero no puedo recibir.
¿ GCDAsyncUdpSocket
falta algo sobre GCDAsyncUdpSocket
? ¿Por qué no puede enviar / recibir después de un tiempo? Cualquier ayuda sería muy apreciada.
Puede ser una configuración de tiempo de espera. Implemente el protocolo GCDAsyncUdpSocketDelegate
para obtener información detallada sobre lo que está sucediendo.
La solución difícil es establecer una nueva conexión.