Comment identifier l'adresse IP de l'expéditeur d'un package udp reçu sur un appareil iOS?

Comment find l'adresse IP de l'expéditeur d'un package udp reçu sur un appareil exécutant iOS 3.2 ou supérieur?

Par exemple, si vous utilisez Python sur un ordinateur, j'utiliserais SocketServer.UDPServer qui prend une sous-class de SocketServer.BaseRequestHandler qui définit le callback de la handle . Lorsqu'un package arrive, le callback est appelé et l'adresse IP de l'expéditeur se trouve dans self.client_address , où self est l'instance de SocketServer.BaseRequestHandler .

Malheureusement, je ne sais pas comment extraire ces informations ou accéder à l'en-tête ip associé lors de la programmation en Objective C et en utilisant les frameworks fournis pour iOS.

À l'heure actuelle, la seule solution que j'ai est d'écrire explicitement l'IP de l'expéditeur sur le corps du package udp, mais je préfère ne pas countr sur l'expéditeur de mettre cette information là si je n'ai pas à le faire.

Vous n'avez pas mentionné quelle API vous utilisez pour recevoir le package. N'écrivez pas l'adresse IP dans le package lui-même car le package peut passer par un certain nombre de traductions d'adresses réseau avant qu'il ne vous parvienne.

Vous pouvez utiliser des sockets BSD standard pour réaliser cette tâche. Il y a aussi quelques classs de Foundation qui s'enroulent autour des sockets BSD, mais je ne les ai pas utilisées personnellement, donc je ne peux pas vous donner un exemple décent.

 // for IPv4 (IPv6 is a little different) ssize_t received; char buffer[0x10000]; struct sockaddr_in listnAddr; struct sockaddr_in fromAddr; socklen_t fromAddrLen = sizeof fromAddr; listnAddr.sin_family = AF_INET; listnAddr.sin_port = htons(12345); // change to whatever port listnAddr.sin_addr.s_addr = htonl(INADDR_ANY); int s = socket(AF_INET, SOCK_DGRAM, 0); // create UDP socket if (s == -1) exit(1); // failed to create socket if (bind(s, (struct sockaddr *) &listnAddr, sizeof listnAddr)) exit(2); // failed to bind to port 12345 for any address received = recvfrom(s, buffer, sizeof buffer, 0, (struct sockaddr *)&fromAddr, &fromAddrLen); if (received == -1) exit(3); // some failure trying to receive data // check the contents of buffer, the address of the source will be in // fromAddr.sin_addr.s_addr but only if (fromAddrLen == sizeof fromAddr) // after the call to recvfrom. char display[16] = {0}; inet_ntop(AF_INET, &fromAddr.sin_addr.s_addr, display, sizeof display); NSLog (@"The source is %s.", display); // could show "The source is 201.19.91.102."