que - sockets en c linux pdf
Cómo verificar la cantidad de datos disponibles para un socket en C y Linux (6)
Tengo un servidor que recibe un flujo continuo de datos. A diferencia de leer varias veces desde un socket, me gustaría leer toda la información en el búfer de recepción de socket con una llamada al sistema para read()
.
Por supuesto, puedo pasar un gran buffer y read()
intentará llenarlo con todos los datos disponibles. Pero esto desperdiciará mucha memoria ya que la mayoría de las veces el búfer malloc''ed sería más grande que los datos reales disponibles en el zócalo. ¿Hay alguna manera de consultar los datos disponibles en un socket?
Creo que está tratando de obtener muchos paquetes con una sola llamada al sistema para reducir los gastos generales debido a las llamadas al sistema.
así que puedes probar las interfaces de los sockets PACKET para los núcleos de Linux 2.4 o 2.6+, prueba esto http://lxr.free-electrons.com/source/Documentation/networking/packet_mmap.txt
Esta es una respuesta "tipo de respuesta": recv(char* buffer, size_t nytes, int flags)
donde flags está OR: con:
MSG_PEEK
This flag causes the receive operation to return data from the beginning of the receive queue without removing that data from the queue. Thus, a subsequent receive call will return the same data.
De modo que puede ver si existe una cantidad arbitraria de bytes en el búfer, sin leer irreversiblemente el búfer. Esta es una respuesta a medias porque no es la forma más eficiente de hacerlo, y MSG_PEEK generalmente se emplea cuando los mensajes tienen encabezados de longitud conocidos como este:
000123DT001
donde 00123
es la longitud del mensaje completo, incluido el encabezado, DT
es el tipo de mensaje y 001
es el número de reintentos por parte del remitente. La idea es que puedas buscar algo que te indique cuántos bytes hacen una lectura completa de un mensaje. No estás interesado en los mensajes. Pero esa es la razón detrás de MSG_PEEK
No no hay. Incluso si hubiera una manera de hacer esto, cualquier respuesta que obtenga estará inmediatamente desactualizada (porque pueden llegar nuevos datos en cualquier momento).
Tenga en cuenta que cuando pasa un búfer para read()
, la función volverá cuando haya una cantidad de datos para leer (al menos un byte), en lugar de esperar a que el búfer se complete por completo.
Puede usar sockets No-bloking o seleccionar () / poll () para ese asunto. Prefiero enchufes sin bloqueo porque puedo hacer otras cosas mientras espero nuevos datos.
Sí:
#include <sys/ioctl.h>
...
int count;
ioctl(fd, FIONREAD, &count);
Tienes que intentar enviar y recibir comandos, así como también puedes leer y escribir en socket carácter por carácter para que no haya desperdicio de memoria y aún mejor comunicación.