¿Cómo enviar un paquete a través de un UDP CFSocket?

Soy un completo novato en redes, sin embargo soy progtwigdor de ac / c ++ y estoy trabajando en object-c (Esto es para OSX / iPhone).

Estoy tratando de aprender cómo enviar un paquete mágico con un socket UDP usando cfsocket. He visto que hay bibliotecas como la biblioteca AsyncUDPSocket, sin embargo no quiero usarlas.

Intenté mirar el archivo UDPecho de las manzanas pero, como principiante, me confundió. He buscado en Google por ALOT, y he reunido el siguiente código, tengo un rastreador de paquetes en ejecución y no registra nada enviado. Entiendo que a mi código le falta mucha captura de errores, sin embargo, solo estoy tratando de obtener lo básico en primer lugar.

¿Es este código correcto? (disculpas si esto parece ambiguo) ¿Qué quiero decir con que me estoy perdiendo ciertas etapas del código como: CFSocketSetAddress?

Si alguien sabe algún tutorial realmente bueno ayudaría.

Cualquier ayuda es muy apreciada, ya que soy un principiante en esto.

Gracias

int main (int argc, const char * argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; CFSocketRef WOLsocket; WOLsocket = CFSocketCreate(kCFAllocatorDefault, PF_INET, SOCK_DGRAM, IPPROTO_UDP, 0, NULL, NULL); if ( socket == NULL) { NSLog(@"CfSocketCreate Failed"); }else{ if( socket ) { NSLog(@"Socket created :)"); struct sockaddr_in addr; memset(&addr, 0, sizeof(addr)); addr.sin_len = sizeof(addr); addr.sin_family = AF_INET; addr.sin_port = htons(9); //port inet_aton("255.255.255.255", &addr.sin_addr); //ip adress char ethadd []= "helloworld"; CFDataRef Data = CFDataCreate(NULL, (const UInt8*)ethadd, sizeof(ethadd)); CFSocketSendData(socket,NULL, Data, 0);} } [pool drain]; return 0; } 

Su problema es muy simple: no le está diciendo a CFSocket a dónde quiere que envíe los datos.

Construye cuidadosamente una dirección en addr , pero luego no la usa. CFSocketSetAddress llamar a CFSocketSetAddress para establecer la dirección de destino en el socket (si desea que todos los paquetes que envíe vayan al mismo destino) o pasar la dirección como el segundo argumento a CFSocketSendData .

¡Este es mi primer código de trabajo para dos noches enteras! ¡Espero que ayude a alguien más! Pensé que debería compartirlo, podría ahorrarle a alguien un poco de molestia.

Deshabilité la llamada de escucha, ya que solo quería enviar datos.

 + (void)broadCast { int socketSD = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); if (socketSD <= 0) { NSLog(@"Error: Could not open socket."); return; } // set socket options enable broadcast int broadcastEnable = 1; int ret = setsockopt(socketSD, SOL_SOCKET, SO_BROADCAST, &broadcastEnable, sizeof(broadcastEnable)); if (ret) { NSLog(@"Error: Could not open set socket to broadcast mode"); close(socketSD); return; } // Configure the port and ip we want to send to struct sockaddr_in broadcastAddr; memset(&broadcastAddr, 0, sizeof(broadcastAddr)); broadcastAddr.sin_family = AF_INET; inet_pton(AF_INET, "255.255.255.255", &broadcastAddr.sin_addr); broadcastAddr.sin_port = htons(33333); char *request = "message from ios by c"; ret = sendto(socketSD, request, strlen(request), 0, (struct sockaddr*)&broadcastAddr, sizeof(broadcastAddr)); if (ret < 0) { NSLog(@"Error: Could not open send broadcast."); close(socketSD); return; } close(socketSD); dispatch_async(dispatch_get_global_queue(0, 0), ^{ //[self listenForPackets]; }); }