Pregunta

¿Cómo puedo crear un cliente UDP toma en C ++ para que se pueda escuchar en un puerto que está siendo escuchada por otra aplicación? En otras palabras, ¿cómo puedo aplicar puerto de multiplexación en C ++?

¿Fue útil?

Solución

  

Quiero escuchar en un solo puerto

Se puede hacer eso con un sniffer. Simplemente ignorar los paquetes de diferentes puertos.

  

Puede ser que necesite para que deje de enviar algunos paquetes particulares, porque mi programa enviará en lugar de la aplicación original

De acuerdo, aquí les sugiero a los succionadores de descarte, y utilizar un MITM técnica.

Usted tendrá que depender de una regla de cortafuegos PREROUTING a Desvío los paquetes a un " Proxy " aplicación. Suponiendo UDP, Linux, iptables, y el " Proxy " que se ejecutan en el mismo host, esto es lo que el " Proxy " en realidad tiene que hacer:

1 Añadir a la regla de cortafuegos Desvío los paquetes (hacerlo de forma manual, si lo prefiere):.

iptables -t nat -A PREROUTING -i <iface> -p <proto> --dport <dport>
    -j REDIRECT --to-port <newport>

2. Enlazar y escuchar en <newport>.

3. retransmitir todo el tráfico entre los puntos finales (2 cliente y destino original). Si se está ejecutando el " Proxy " en un host diferente, el uso getsockopt con SO_ORIGINAL_DST para recuperar la dirección de destino original.

Puede sonar complicado, pero ... sí, eso es porque es un poco complicado :-) Consulte la documentación del servidor de seguridad si mis diverge suposición.

Otros consejos

Esto es sólo la detección de paquetes como tcpdump o snoop, abrir un zócalo y tirar todo prima del alambre y el filtro como sea necesario. Es probable que desee usar libpcap para hacer las cosas un poco más fácil.

Sin privilegios de administrador o de super-usuario tendrá la aplicación de destino a los puertos abiertos con SO_REUSEADDR y SO_REUSEPORT según sea apropiado para la plataforma. La advertencia es que sólo se puede recibir paquetes de difusión y multidifusión, paquetes unicast se entregan al primer socket abierto.

Este es no multiplexación -. Ese término se reserva para el manejo de I / O en múltiples canales en el mismo proceso y donde cosas como select(2) y poll(2) son más útiles

Lo que se está pidiendo es multidifusión . Aquí es el ejemplo básico.

Tenga en cuenta que IP se reserva una gama especial de direcciones (también denominado grupos) para la multidifusión. Estos se asignan a direcciones Ethernet especiales. El oyente (s) tendría que unirse a el grupo de multidifusión, mientras que el remitente no tiene por qué, sólo se envía como de costumbre.

Espero que esto ayude.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top