tag puddletag portable picard para musicbrainz mp3tag kid3 easytag linux networking udp ipv4

linux - puddletag - Obtener la dirección de destino de un paquete UDP recibido



musicbrainz picard portable (2)

Establece la opción IP_PKTINFO usando setsockopt y luego usa recvmsg y obtiene una estructura in_pktinfo en el miembro msg_control de struct msghdr. El in_pktinfo tiene un campo con la dirección de destino del paquete.

Consulte: http://www.linuxquestions.org/questions/programming-9/how-to-get-destination-address-of-udp-packet-600103/ donde encontré la respuesta para obtener más detalles.

Al recibir un paquete UDP, debo responder al remitente con la dirección que usó para enviar el paquete al que respondo.

La llamada de recibo me permite obtener la dirección del remitente, pero ¿cómo obtengo la dirección de destino del paquete recibido, que debe coincidir con la dirección de una de las interfaces del host local?


He construido un ejemplo que extrae las direcciones de origen, destino e interfaz. Por brevedad, no se proporciona verificación de errores.

// sock is bound AF_INET socket, usually SOCK_DGRAM // include struct in_pktinfo in the message "ancilliary" control data setsockopt(sock, IPPROTO_IP, IP_PKTINFO, &opt, sizeof(opt)); // the control data is dumped here char cmbuf[0x100]; // the remote/source sockaddr is put here struct sockaddr_in peeraddr; // if you want access to the data you need to init the msg_iovec fields struct msghdr mh = { .msg_name = &peeraddr, .msg_namelen = sizeof(peeraddr), .msg_control = cmbuf, .msg_controllen = sizeof(cmbuf), }; recvmsg(sock, &mh, 0); for ( // iterate through all the control headers struct cmsghdr *cmsg = CMSG_FIRSTHDR(&mh); cmsg != NULL; cmsg = CMSG_NXTHDR(&mh, cmsg)) { // ignore the control headers that don''t match what we want if (cmsg->cmsg_level != IPPROTO_IP || cmsg->cmsg_type != IP_PKTINFO) { continue; } struct in_pktinfo *pi = CMSG_DATA(cmsg); // at this point, peeraddr is the source sockaddr // pi->ipi_spec_dst is the destination in_addr // pi->ipi_addr is the receiving interface in_addr }