2011-10-15 6 views
7

que tiene un descriptor de socket TCP de la siguiente manera:¿Se pueden convertir las descripciones de los sockets en punteros de archivo?

int desc = accept(socket_descriptor, &client_address, &len)

Ahora, desde este descriptor desc Quiero conseguir un apuntador de archivo. ¿Se puede usar fdopen() aquí?

La razón por la que deseo obtener un puntero de archivo es porque estoy realizando cambios en un código existente que escribe datos en un archivo local. Ahora, quiero extender su funcionalidad para que pueda escribir alternativamente en un cliente TCP. No quiero volver a escribir todas las funciones y estaba pensando en poder usar la infraestructura existente de alguna manera. Las funciones existentes usan el puntero del archivo para escribir en el archivo. Me preguntaba si era posible hacer que la misma función escriba en una transmisión TCP sin realizar ningún cambio.

Respuesta

8

Sí, fdopen() es exactamente lo que necesita. Aquí está lo man page está diciendo al respecto:

La función fdopen() asocia un flujo con el descriptor de archivo existente, fd. El modo de la secuencia (uno de los valores "r", "r +", "w", "w +", "a", "a +") debe ser compatible con el modo del descriptor de archivo . El indicador de posición de archivo de la nueva secuencia se establece en que pertenece a fd, y los indicadores de error y de fin de archivo están desactivados. Los modos "w" o "w +" no provocan el truncamiento del archivo. El descriptor de archivo no está duplicado, y se cerrará cuando se cierre la secuencia creada por fdopen(). El resultado de aplicar fdopen() a un objeto de memoria compartida no está definido.

Pero úsela con precaución al aplicar descripciones de socket. Las funciones de E/S de alto nivel utilizan el almacenamiento en búfer y pueden enviar datos de manera diferente (es decir, cuando se encuentra \n en la secuencia, inserte \r) etc.

+1

La mayoría de los archivos no están en búfer de línea, solo 'stdout'. No estoy seguro de si hay una forma de configurar un archivo para que sea búfer de línea, pero creo que la mayoría se almacenará en búfer de bloque, lo que debería ser un poco más compatible con el socket. –

+0

@ChrisLutz: la función es 'setlinebuf'. Creo que 'stdout' solo está almacenado en la línea si está enganchado a una terminal, pero no estoy seguro. –

+0

@DietrichEpp - Gracias. Y creo que tienes razón sobre 'stdout'. –

Cuestiones relacionadas