2011-10-08 15 views
6

Tengo un servidor C++ que actúa como un espejo. Lo que entra sale a un socket diferente. En este momento, lee el socket en un buffer y lo escribe en el otro socket. Quiero mejorar el rendimiento.Tubería entre tomas

Tengo read stuff aproximadamente sendfile() y splice(), pero parece limitado a las transferencias de "archivo a socket". Quizás un simple pipe() entre tomas funcionaría. ¿Que recomiendas?

Una solución portátil sería perfecta, pero está bien si es solo para Linux.

+1

Esto podría ser de alguna utilidad http://unix.stackexchange.com/questions/9593/can-splice-tee-be-made-to-work-with-sockets- and-not-merely-pipes – Arunmu

+0

¡Puede ser que pueda usar el mismo puerto para ambos enchufes! – Arunmu

+1

Un enlace más que transfiere datos a través de la tubería :): http://markmail.org/thread/4cils4zyoxtrq3zu – Arunmu

Respuesta

4

Puede configurar un conducto con nombre en linux. Múltiples procesos podrían leer/escribir a partir de esto. Echa un vistazo a este enlace: http://www.cs.fredonia.edu/zubairi/s2k2/csit431/more_pipes.html.

También como se mencionó anteriormente, usar netcat debería ser el truco (http://netcat.sourceforge.net/).

+0

Por lo que sé (según un archivo fuente BSD), 'nc' utiliza un búfer de 8192 bytes, que es básicamente mi solución en este momento. –

+0

Podría considerar el uso de un conducto con nombre y compararlo, pero incluso si el archivo FIFO está basado en RAM, no veo cómo podría ir más rápido que una simple copia de memoria. –

0

he comprobado nc(netcat) comando como se ha mencionado por Ralu en su comentario y funciona entre dos tomas cuando se utiliza con tubería :)

que utiliza el comando a continuación:

 

netcat -l 5556 | netcat localhost 5557 
 

me enviaron los datos a la puerto 5556 (un cliente python) configurado por el primer comando nc e hizo un servidor (código python pequeño) escuchando en el puerto 5557.

Podría Recv de datos desde el puerto 5557

+0

Sin duda, pero la pregunta no es sobre la posibilidad de hacerlo, se trata de "optimizarlo". –