Estoy buscando una forma de agregar emulación de red a un zócalo.Simular las condiciones de la red con un zócalo C/C++
La solución básica sería de alguna manera agregar la limitación del ancho de banda a una conexión.
La solución ideal para mí sería:
- Apoyo propiedades de red avanzada (latencia, pérdida de paquetes)
- de código abierto
- tuvo un API similar a enchufes estándar (o se envuelve alrededor de ellos)
- trabajo en Windows y 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 me va a funcionar, 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.
EDIT: Necesito incorporar esta funcionalidad en mi propio producto, por lo tanto, no es aceptable utilizar una caja adicional 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:
Añadir retrasos para enviar/recibir operación (Basado en la respuesta de @ PaulCoccoli):
mediante la adición de un retardo antes de enviar y recibir, se puede obtener una simulación de red muy cruda (retardo constante para 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 de gran inspiración para mí, por lo que le otorgo la recompensa.
Añadir la lógica de simulación de la red como un proxy (Basado en @ m0she y otros respuesta):
Cualquiera de enviar la solicitud a través del proxy o bien utiliza el proxy para interceptar las peticiones, a continuación, añadir 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, 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, por lo que estoy aceptando esta respuesta.
C++ no tiene enchufes. –
Es una aplicación C++, aunque tiene razón: los sockets son C (winsock y POSIX) –
C tampoco tiene sockets ... Las bibliotecas proporcionadas por el SO sí (con las interfaces C). No ser pedante ... :) –