¿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
Respuesta
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.
Supongo que esto es exactamente lo que necesito. :) Muchas gracias. – SkypeMeSM
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.
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
A continuación, obtenga el Wireshark (http://www.wireshark.org/), huela los paquetes, vacíelo en un archivo y pruebe. –
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
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.
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
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. –
- 1. ¿Cómo escucho múltiples puertos udp usando twisted?
- 2. en Java, ¿cómo lograr escanear puertos UDP?
- 3. programación de socket udp sin bloqueo en C: ¿qué obtengo?
- 4. Error de socket 10052 en el socket UDP
- 5. ¿Cómo configurar un socket Winsock UDP?
- 6. Socket C# UDP: Obtener la dirección del receptor
- 7. Tutorial de socket UDP simple necesario
- 8. Obtener puerto aleatorio para socket UDP
- 9. Enviar datos grandes en el socket UDP
- 10. escribiendo un servidor de multiplexación en clojure?
- 11. ¿Pueden dos puertos UDP diferentes en un sistema enlazar el mismo puerto?
- 12. ¿Cómo recuperar los puertos TCP y UDP con Nmap?
- 13. C# escucha UDP Async SocketException
- 14. Configuración de la IP de origen para un socket UDP
- 15. ¿Cómo crear un servidor UDP en C?
- 16. Cómo obtener su propia dirección IP (local) desde un socket udp (C/C++)
- 17. manera adecuada para cerrar un socket UDP bloqueo
- 18. Transferir socket UDP en node.js desde la aplicación a HTTP
- 19. Socket de Python UDP que falla al recibir semi-aleatoriamente
- 20. ¿puedo leer exactamente un paquete UDP de un socket?
- 21. Cómo recuperarse con gracia de una excepción de socket C udp
- 22. Use el mismo socket udp para async receive/send
- 23. ¿Cómo debería uno derribar un impulso :: asio :: ip :: udp :: socket?
- 24. conectar en "conexión menos" boost :: asio :: ip :: udp :: socket
- 25. Cómo configurar el puerto de origen en el socket UDP en c?
- 26. seleccionar en el socket UDP no termina cuando se cierra el socket - ¿Qué estoy haciendo mal?
- 27. C#: Oído de escucha UDP
- 28. Verificación abierta del puerto UDP
- 29. ¿Cómo puedo configurar el tamaño del buffer para el Socket UDP inferior? C#
- 30. Reenvío de puertos (NAT UPNP) ERROR
¿Por qué harías eso? – jweyrich
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
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