GCDAsyncUdpSocket y envío y recepción de multidifusión

En el primer enfoque, creo la aplicación cliente-server, basada en sampleProject , que envía algunos datos al server.

Legend: sender address = reciver ip port = reciver port reciver address = null since he is listening port = in my case 55555 

Código de trabajo

omitir la comprobación de errores es intencional solo por razones públicas

Remitente

 -(id*)initForSender:(NSString*)address port:(int)port { self = [super init]; if (self) { _port = port; _address = address; tag = 0; _udpSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()]; [_udpSocket bindToPort:0 error:&error]; [_udpSocket beginReceiving:&error]; return self; } } -(void)send:(NSData*)data{ [_udpSocket sendData:data toHost:_address port:_port withTimeout:-1 tag:tag]; tag++; } 

Receptor / Oyente

 -(id*)initForReceiver:(NSString*)address port:(int)port { self = [super init]; if (self) { _port = port; _udpSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()]; NSError *error = nil; [_udpSocket bindToPort:0 error:&error]; [_udpSocket beginReceiving:&error]; } return self; } - (void)udpSocket:(GCDAsyncUdpSocket *)sock didReceiveData:(NSData *)data fromAddress:(NSData *)address withFilterContext:(id)filterContext { //Do something with receive data } 

Multidifusión

Pero luego quiero un cliente que enviará a muchos receptores. Formulario Sé que el remitente o el oyente deben usar [GCDAsyncUdpSocket joinMulticastGroup: error] ;. Corrí a través de stackoverflow, tío google y CococaAsyncSocket (donde no hay palabra abou udp), combiné piezas de información y obtuve este código. Estoy perfectamente seguro, eso no funciona, pero no tengo ni idea de por qué.

 Legend: sender address = sender ip port = sender port in my case 55555 reciver address = sender ip port = sender port in my case 55555 

Código no funciona

 -(id*)initForSender:(NSString*)address port:(int)port { self = [super init]; if (self) { _port = port; _address = address; _udpSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()]; NSError *error = nil; [_udpSocket bindToPort:_port error:&error]; [_udpSocket joinMulticastGroup:_address error:&error]; [_udpSocket enableBroadcast:YES error:&error]; } return self; } -(void)send:(NSData*)data{ [_udpSocket sendData:data toHost:_address port:_port withTimeout:-1 tag:tag]; tag++; } 

Receptor / Oyente

 -(id*)initForReceiver:(NSString*)address port:(int)port { self = [super init]; if (self) { _port = port; _address = address; _udpSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()]; NSError *error = nil; [_udpSocket bindToPort:_port error:&error]; [_udpSocket joinMulticastGroup:_address error:&error]; [_udpSocket beginReceiving:&error]) } return self; } - (void)udpSocket:(GCDAsyncUdpSocket *)sock didReceiveData:(NSData *)data fromAddress:(NSData *)address withFilterContext:(id)filterContext { //Do something with receive data } 

ACTUALIZAR:

Resulta que cuando utilizo un IP no utilizado como address por ejemplo @ "224.0.1.1", entonces funciona, pero se siente extraño un poco. ¿Lo estoy haciendo correcto?

  1. Las direcciones de multidifusión son direcciones reservadas especiales para fines de multidifusión. Cuando un host envía datos a una dirección de multidifusión (grupo), todos los hosts que se han unido a ese grupo recibirán los datos.

  2. Cualquier host que desee recibir datos de un grupo de multidifusión debe join a ese grupo. Los tres pasos para GCDAsyncUdpSocket son: (tenga en count que la combinación de la dirección de grupo y el puerto de grupo debe ser única para ese grupo de multidifusión seleccionado)

     [_udpSocket bindToPort:_port error:&error]; [_udpSocket joinMulticastGroup:_address error:&error]; [_udpSocket beginReceiving:&error]) 
  3. Para un remitente, no necesita estas dos líneas como lo ha hecho.

     [_udpSocket bindToPort:0 error:&error]; //bindToPort:0 is same as auto-select sender port by default. [_udpSocket beginReceiving:&error]; //if you don't want to received, no need for this. 

Use el 239.0.0.0-239.255.255.255 para su networking local privada. Evite 224 … Puede leer más en el enlace de arriba.