studio - sockets en c++
Simular las condiciones de la red con un zócalo C/C++ (8)
Solo sé Network Link Conditioner para Mac OS X Lion. Deberías ser el desarrollador de Mac para descargarlo, así que no puedo poner el enlace de descarga allí. Solo descripción de 9to5mac.com: http://9to5mac.com/2011/08/10/new-in-os-x-lion-network-link-conditioner-utility-lets-you-simulate-internet-and-bandwidth -condiciones /
Estoy buscando una forma de agregar emulación de red a un socket.
La solución básica sería una forma de agregar limitación de ancho de banda a una conexión.
La solución ideal para mí sería:
- Admite propiedades de red avanzadas (latencia, pérdida de paquetes)
- Fuente abierta
- Tener una API similar a los conectores estándar (o envolverlos)
- Trabaja tanto en Windows como en Linux
- Soporte IPv4 e IPv6
Vi algunas opciones que funcionan en el nivel del sistema, o incluso como proxy (Dummynet, WANem, neten, etc.), pero eso no funcionará para mí, porque quiero poder emular cada socket manualmente (por ejemplo , abra un socket con emulación de módem y uno con emulación 3G. Básicamente, quiero saber cómo lo hacen estas herramientas.
EDITAR: Necesito incorporar esta funcionalidad en mi propio producto, por lo tanto, no es aceptable usar una caja extra o una herramienta de terceros que necesite una configuración manual. Quiero escribir código que haga lo mismo que esas herramientas, y mi pregunta es cómo hacerlo.
Epílogo: En retrospectiva, mi pregunta fue un poco engañosa. Aparentemente, no hay forma de hacer lo que quería directamente en el socket. Hay dos opciones:
Agregar demoras para enviar / recibir la operación (Basado en la respuesta de @ PaulCoccoli):
añadiendo un retraso antes de enviar y recibir, puede obtener una simulación de red muy cruda (retraso constante para la latencia, retraso en el envío, para no enviar más de X bytes por segundo, para ancho de banda).
La respuesta y el comentario de Paul fueron una gran inspiración para mí, así que le otorgué la recompensa.
Agregue la lógica de simulación de red como un proxy (Basado en @ m0she y otros responden):
Envíe la solicitud a través del proxy, o use el proxy para interceptar las solicitudes, luego agregue la simulación deseada. Sin embargo, tiene más sentido utilizar una solución preparada en lugar de escribir su propia implementación de proxy: por lo que he visto, Dummynet es probablemente la mejor opción (esto es lo que hace webpagetest.org). Otras opciones están en las respuestas a continuación, también agregaré DonsProxy
Esta es la mejor manera de hacerlo, así que estoy aceptando esta respuesta.
Puede compilar un proxy en su software que haría eso. Puede ser una implementación de proxy de calcetines completo (como este ) o probablemente mejor, algo más simple que solo serviría para su propósito (y no requiere el prefijo de su comunicación con el destino y otros gastos generales de los calcetines). Ese código podría ejecutarse como un proceso separado o un hilo dentro de su proceso.
Agregar aceleración a un proxy no debería ser demasiado difícil. Usted puede:
- retrasar el reenvío de datos si supera cierto límite de ancho de banda
- agregue latencia al agregar un temporizador antes de las operaciones de lectura / escritura en los buffers.
- Si está trabajando con un protocolo basado en conexión (como TCP), sería absurdo descartar paquetes, pero con un protocolo basado en datagramas (UDP) también sería fácil de implementar.
La API de creación de conexión sería un poco diferente de la combinación normal de posix / winsock (a menos que hagas alguna macro u otra magia), pero todo lo demás (enviar / recv / seleccionar / cerrar / etc.) es el mismo.
Es posible que desee comprobar WANem http://wanem.sourceforge.net/ . WANEM es de código abierto y está licenciado bajo la licencia pública general de GNU.
WANem permite al equipo de desarrollo de aplicaciones configurar una puerta de enlace de aplicación transparente que se puede usar para simular características WAN como retardo de red, pérdida de paquetes, corrupción de paquetes, desconexiones, reordenamiento de paquetes, fluctuación de fase, etc.
Si está integrando esto en su producto, debe implementar una capa de abstracción sobre la API de sockets para que pueda seleccionar su propia implementación en tiempo de ejecución. De forma alternativa, puede implementar envoltorios de cada función de socket y seleccionar si desea llamar a su propia versión o a la versión del sistema.
En cuanto a agregar latencia, puede hacer que su implementación de la API de sockets se salga de un hilo. En ese hilo, tenga una cola de prioridad ordenada por tiempo (es decir, este hilo de fondo realiza una simulación de eventos discretos muy básica). Cada "paquete" que envíe o reciba podría enviarse junto con un tiempo de entrega. Cada tiempo de entrega debe tener cierta cantidad de retraso agregado. Usaría algún tipo de generador de números aleatorios con una distribución gaussiana.
El hilo de fondo también debería simular el otro lado de la conexión, aunque parece que ya has implementado esa parte.
Creo que podrías usar una herramienta como Network Simulator . Es gratis, para Windows.
Lo único que debe hacer es configurar su programa para usar los puertos correctos (y la configuración de la red, por supuesto).
Si desea una solución de software único que controle, deberá implementarla usted mismo. No conozco ningún paquete existente.
Si bien una capa de envoltura sobre un socket puede darle la posibilidad de introducir un retraso, no será suficiente para introducir la pérdida o la entrega fuera de servicio. Para simular esas actividades, realmente necesita interceptar los datos en tránsito entre las dos pilas TCP.
El enfoque que recomendaría es usar un dispositivo de tunelización (digamos tunX
). Las rutas se deben configurar para que el cliente crea que el camino hacia el servidor se realiza a través de tunX
. El código adicional (tal vez ejecutado en un hilo diferente) interceptaría el tráfico en tunX
de manera tunX
y realizaría su comportamiento aumentado antes de reenviar paquetes a través de la verdadera interfaz física que obtendrá el tráfico hacia su servidor. Lo contrario ocurriría con los paquetes que llegan del servidor en la interfaz física. Esos paquetes serían interceptados por el código del cliente, comportamiento aumentado, antes de reenviar a través de tunX
.
Sin embargo, dado que está probando el software del cliente, no estoy seguro de por qué desea insertar este código en su software lanzado, a menos que el software en sí sea un cliente simulador de WAN.
Esta respuesta podría ser una solución parcial para usted cuando use linux: simule paquetes retrasados y descartados en Linux . Se refiere a un módulo kernel llamado netem , que puede simular todo tipo de problemas de red.
Si desea trabajar con conexiones TCP, tener "pérdida de paquetes" podría ser problemático ya que una gran cantidad de manejo de errores (como la recuperación de paquetes perdidos) se realiza en el kernel. Simular esto de una manera multiplataforma podría ser difícil.
generalmente agrega un dispositivo de red a su red que acelera el ancho de banda o la latencia, puerto por puerto, luego puede lograr lo que desea simplemente conectándose al puerto asignado al tipo particular de red defectuosa que desea probar, con sin cambios de código o modificaciones requeridas.
La forma más sencilla de hacerlo es simplemente agregar reglas de iptables a un servidor Linux que actúa como un proxy.
Si desea que funcione sin el dispositivo por separado, intente goteo que es un paquete de software que acelera su red en su PC cliente. (o para Windows )