Cómo crear un programa de servidor de cliente TCP en C sin un búfer

En Linux, OSX, Solaris (y algunos otros sistemas similares a Unix), tiene la llamada al sistema sendfile(2) que copia datos de un descriptor de archivo a otro descriptor de archivo, evitando así la copia en memoria de datos a / desde un búfer en espacio de usuario Tenga en cuenta que copia datos a través de descriptores de archivos genéricos (por lo que incluye tuberías / fifos y sockets), no solo archivos normales, ya que el nombre podría sugerir a los distraídos. En Microsoft Windows (aparentemente desde Windows 8) hay TransmitFile() que hace aproximadamente lo mismo.

En Linux también existe la llamada al sistema splice(2) , que adopta un enfoque más general para el mismo problema.

Esto no significa que puede hacer un cliente-servidor completamente sin usar buffers, pero al menos, al hacer transferencias de datos masivas, no tendrá que copiar datos de un lado a otro en el kernelspace y el espacio de usuario, lo que ahorra bastante de recursos.

Editar : dicho eso, solo para archivos regulares, creo que también existe la opción de mmap(2) un archivo regular (es decir, mapear un archivo regular en un espacio de direcciones), y luego usar llamadas regulares read(2) y write(2) en la región mapeada en memoria. Pero en este caso, debe saber de antemano la longitud de los datos ( mmap(2) requiere un argumento de longitud distinta de cero), que es fácil cuando se envían datos desde archivos normales, pero menos fácil cuando se reciben datos.

Esta es una pregunta interesante. Estoy interesado principalmente en por qué uno querría hacer esto.

¿Estás tratando de ponerlo en un pequeño microcontrolador que no tiene RAM? Solo registros?

De cualquier manera, necesitaría hacer un búfer de algún tipo, para manejar la entrada proveniente del servidor … Si realmente está en un entorno donde no hay RAM disponible, tendría que dedicar algunos de sus registros para actuar como un búfer …

¿Podrías leer 1 byte a la vez y escribir directamente en un archivo?

Sin embargo, esa es una manera realmente basura de hacerlo, ¿tiene alguna razón para no usar un búfer? Incluso un pequeño buffer de 1kb sería una mejora masiva en ningún buffer.