2009-07-08 13 views
12

Estoy trabajando en escribir una aplicación de red en C++ en la plataforma Linux utilizando la API sockets típica, y estoy buscando 2 formas alternativas de escribir una matriz de bytes a una secuencia TCP: llamando a write() o llamando a send(). Sé que, dado que esto es Linux, el manejador de socket es simplemente un descriptor de archivo y, por lo tanto, es válido para realizar llamadas de lectura() y de escritura() en el socket; sin embargo, el socket API también proporciona send() y recv () funciones para realizar las mismas tareas.Repercusión en el rendimiento del uso de write() en lugar de send() al escribir en un socket

Por lo tanto, me pregunto si hay alguna razón particular para elegir una clase de funciones sobre la otra: ¿las funciones de envío/recepción están optimizadas para escritura/lectura en red, funcionan mejor, etc.? ¿O es realmente arbitrario qué funciones uso? ¿Lectura() y escritura() se comportan correctamente en todos los casos?

¡Gracias por cualquier idea!

Respuesta

19

No debería haber diferencia. Citando de man 2 send:

La única diferencia entre send() y write() es la presencia de banderas. Con el parámetro de banderas cero, send() es equivalente a write().

Siempre y cuando usted no desea especificar y banderas para send() puede utilizar libremente write().

+0

¿Es esto cierto para FreeBSD u otras plataformas también? - esa línea no aparece en mi página man de send (2). –

+0

@GoodPerson Se aplica a todas las plataformas. Si eso no fuera así, 'inetd' y similares no funcionarían. ('inetd' duplica su socket en el stdin y stdout de su proceso daemon, y su proceso puede interactuar directamente con stdin y stdout de la manera normal, sin darse cuenta de que son sockets. Por supuesto, también puede hacer cosas de socket con ellos.) –

6

recv y send le permiten especificar indicadores, como para paquetes fuera de banda. Si no necesita especificar los indicadores, read y write son perfectamente adecuados.

1

write v.s. send para un solo byte, o una única matriz probablemente no será muy diferente; pronto terminarán con la misma ruta de código (en última instancia, realizan la misma operación). La sobrecarga en la transmisión de red es altamente improbable que esté en ese nivel; será la conexión TCP real y mover los bits a través de cables.

Sin embargo, si tiene la intención de enviar mensajes grandes y de varias partes de una sola vez, debería mirar la llamada de sistema sendmsg() - esto le permite especificar una lista de matrices no contiguas de datos para enviar.

Al final del día se aplican las pautas normales: primero escriba la aplicación y luego comparta para ver dónde están los cuellos de botella.

+1

En matrices no contiguas para recibir/enviar: readv y writev también permiten eso. ¡Yay para scatter/gather I/O! –

Cuestiones relacionadas