2012-05-17 17 views
5

Duplicar posible:
How do you throttle the bandwidth of a socket connection in C?¿Cómo limito la velocidad del socket en C?

Estoy escribiendo un servidor FTP sencillo en C para un entorno Unix. Como característica del servidor, quiero limitar la velocidad de carga/descarga de un usuario.

  1. ¿Hay alguna función de biblioteca que resuelva directamente este problema?

  2. Si no, ¿cuál es el algoritmo utilizado en un servidor FTP de producción? Tengo una solución muy ingenua: calcule cuántos bytes enviar en un segundo, digamos x, write(x) o read(x), y luego sleep(1).

Debería haber una solución mejor. Aún mejor si hay muestras de código.

Para ser claros, estoy usando Mac OS X, pero me gustaría que también se pudiera ejecutar bajo Ubuntu o algún Linux.

+0

* "Como una característica del servidor, deseo de limitar la velocidad de carga/descarga de un usuario" * - Eso suena como una característica impresionante –

+0

¿En qué SO estás? – jman

+1

Esta pregunta podría ayudar - http://stackoverflow.com/questions/235762/how-do-you-throttle-the-bandwidth-of-a-socket-connection-in-c –

Respuesta

0

¿Estás seguro de que quieres hacer esto? ¿Su motivo es molestar a sus usuarios? (este es un motivo legítimo - vea cualquiera de los varios sitios de "carga gratuita")

La limitación de ancho de banda como esta no es una buena manera de proteger su servidor contra sobrecargas. personas encontrarán clientes con subprocesos y sesiones FTP concurrentes abiertas ...

¿hay alguna función de biblioteca para hacer eso?

Probablemente no, la configuración del ancho de banda es una tarea del sistema operativo, no una tarea de servicio.

¿Cuál es el algoritmo?

El que describes suena bastante efectivo.

Para hacerlo mejor, puede ver cuántos octetos se han leído o escrito y cuánto tiempo se ha gastado antes de decidirse a dormir. Considere el caso en que el cliente es más lento que su límite: las lecturas y escrituras terminarán bloqueando y su suspensión() simplemente agregará latencia innecesaria. esto también reducirá los efectos de ocultación de la latencia del disco, etc. del usuario.

Podría considerar usar usleep o nanosleep para obtener una resolución más fina ambos están en posix, por lo que deberían estar en OSX * BSD y linux.

0

FTP es un protocolo de capa de aplicación. FTP puede ejecutarse en sockets TCP o UDP. (EDIT: TFTP y uftp se ejecuta en UDP, pls ver la sección de comentarios para más detalles)

El zócalo velocidad está en función de lo siguiente:

  1. velocidad enlace: 10/100 Base T y así sucesivamente.
  2. BER del enlace: Tasa de error de bit (normalmente en el mundo de hoy es generalmente baja 10 a la potencia -9 o algo por el estilo. También hay errores de ráfaga.
  3. tamaños Socket búfer: /proc/sys/net/core parámetros

en Linux: Para el manejo de los sockets TCP aquí un buen artículo [1]

4.Tweak la pila para filtrar/paquetes de gota para introducir la pérdida de paquetes, por lo tanto, eventualmente estrangulando la velocidad del flujo: Herramientas como netem [2] le ayudan a ajustar los cucharones para estrangular los flujos.

[1] http://www.cyberciti.biz/faq/linux-tcp-tuning/

[2] http://www.linuxfoundation.org/collaborate/workgroups/networking/netem

+2

"FTP se puede ejecutar en sockets UDP" ... esta afirmación requiere pruebas. –

+1

Para evitar el debate de digresión a FTP, no proporcioné detalles allí. 1. tftp se ejecuta en el puerto udp 69 para velocidad. 2. Hay uftp, que es una transferencia de archivos múltiples que proporciona cifrado para la seguridad. –

+1

TFTP transfiere archivos, pero no es FTP. Ditto uftp. –

Cuestiones relacionadas