2010-10-07 17 views
5

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

+0

¿Por qué harías eso? – jweyrich

+0

La multiplexación solo es útil si el otro extremo del socket espera datos mux (a menos que intente "forjar" los datos que el otro extremo espera). – dreamlax

+0

Supongo que debo explicar el escenario un poco mejor. Tengo una aplicación ejecutándose en el puerto 5000. Quiero escuchar en el mismo puerto, para que pueda recibir y analizar todos los paquetes que la aplicación está recibiendo. Pensé que podía usar la opción SO_REUSEADDR para enlazar el socket, pero esto ESPERA que la aplicación original se cierre antes de que mi programa reciba paquetes en el mismo puerto. Espero que la pregunta y el comportamiento deseado estén claros ahora. Gracias por responder. – SkypeMeSM

Respuesta

3

Quiero escuchar en un solo puerto

Usted puede hacer eso con un sniffer. Simplemente ignore 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

bien, aquí le sugiero que haga descartar rastreadores, y utilizar un MITM técnica.

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

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

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

2. atar y escuchar en <newport>.

3. Retransmite todo el tráfico entre los 2 puntos finales (cliente y destino original).Si está ejecutando el "proxy " en un host diferente, use 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 de su firewall si mi suposición diverge.

+0

Supongo que esto es exactamente lo que necesito. :) Muchas gracias. – SkypeMeSM

1

Esto es no multiplexación - que término se reserva para la manipulación 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 está pidiendo es multicast. Here es el ejemplo básico.

Tenga en cuenta que IP reserva un rango especial de direcciones (a.k.a. grupos) para multidifusión. Estos se asignan a direcciones de ethernet especiales. Los oyentes tendrían que unirse al grupo de multidifusión, mientras que el remitente no tiene que hacerlo, simplemente envía como de costumbre.

Espero que esto ayude.

+0

Tengo una aplicación de software que se ejecuta en el puerto 5000, y no puedo modificar esa aplicación para que se una a cualquier grupo de multidifusión o de la misma manera. Quiero escuchar en el mismo puerto para que mi código pueda analizar todos los paquetes recibidos por esa aplicación. Tenía la idea de que esto se llamaba 'multiplexación de puertos', pero no puedo encontrar un ejemplo adecuado para el mismo. – SkypeMeSM

+0

A continuación, obtenga el Wireshark (http://www.wireshark.org/), huela los paquetes, vacíelo en un archivo y pruebe. –

+0

Estoy usando wireshark para mirar los paquetes sin conexión, pero tengo que escribir un programa C++ que olfatea o escucha en un puerto particular y no en todos los puertos, y no puede estar fuera de línea. Puedo usar la biblioteca libpcap, pero como dije, quiero escuchar solo en un puerto, y podría necesitar evitar que envíe algunos paquetes en particular, ¡porque mi programa lo enviará en lugar de la aplicación original! No estoy seguro si te estoy confundiendo mucho :) – SkypeMeSM

2

Esto es solo un paquete olfateando como tcpdump o , abra un socket sin procesar y extraiga todo del cable y filtro como lo requiera. Es probable que desee utilizar libpcap para hacer las cosas un poco más fáciles.

Sin privilegios de administrador o superusuario, necesitará la aplicación de destino para abrir puertos con SO_REUSEADDR y SO_REUSEPORT según corresponda para la plataforma. La advertencia es que solo puede recibir paquetes de difusión y multidifusión, los paquetes de difusión única se entregan al primer socket abierto.

+0

Ok. Entonces, en su opinión, la única otra alternativa es usar libpcap para olfatear cada paquete en una interfaz de red y luego filtrar los paquetes para ese puerto en particular. Estaba pensando que, dado que estos son paquetes UDP (sin conexión), no debería haber sido un problema enviar/recibir de forma pasiva/activa el paquete en el mismo puerto. – SkypeMeSM

+0

Lo he intentado, Linux solo entrega al primer socket, no multiplexa los paquetes de unidifusión. Es probable que otras plataformas sean diferentes por motivos de rendimiento. –

Cuestiones relacionadas