Función RECV en lenguaje C

Función RECV en lenguaje C

El lenguaje C ofrece varias posibilidades y el uso de diferentes funciones para enviar y recibir los datos a través de un socket. Cada uno de ellos proporciona una propiedad o restricción diferente. Sin embargo, el "socket.H "encabezado define la función Recv () que está específicamente diseñada para leer los archivos de Socket y proporciona opciones para recibir el modo, esperar, etc., haciéndolo más adecuado para usar en conexiones.

En esto Pista de Linux artículo, aprenderá cómo usar el Recv () función. Una de las dos funciones se utilizan para enviar y recibir los datos a través de un socket en el idioma C.

Observaremos la sintaxis de esta función y su descripción teórica de cómo funciona, los argumentos de entrada y salida, y el tipo de datos aceptado por cada uno de ellos.

Luego, implementaremos lo que aprendimos en un ejemplo práctico con fragmentos e imágenes de código donde creamos una aplicación de consola para enviar los comandos al servidor y recibir la respuesta con el Recv () función.

Sintaxis de la función Recv () en lenguaje C

ssize_t recv (int Sockfd, void *buf, size_t len, int flags);

Descripción de la función Recv () en el lenguaje C

El Recv () la función recibe los datos que se envían a través de un socket. Esta función recibe los datos del socket cuyo identificador está configurado para choque. Los datos recibidos se almacenan en el búfer que se apunta a bufón cuyo tamaño debe especificarse en el fila argumento de entrada. La entrada banderas son indicadores de control que se agrupan en un entero que configura cómo esta función recibe los datos a través del socket.

Cuando Recv () se llama y no hay datos que estén esperando en la cola, el programa espera hasta que llega un nuevo paquete y luego reanuda la ejecución de la siguiente línea de código. Este tiempo muerto se puede suprimir utilizando la función Pool () para consultar si los datos están esperando o no ser recibidos, evitando así llamadas innecesarias a la función Recv ().

Otra posibilidad es habilitar el indicador de MSG _dontwait para establecer una recepción que no sea bloqueo. Si el Recv () la función devuelve con éxito, devuelve el número de bytes que se reciben como resultado. Si se produce un error en la recepción, Recv () Devuelve -1 y el código específico para ese error se puede recuperar a través del errar variable global.

A continuación, veamos los argumentos de entrada individuales de esta función en detalle:

choque: Este argumento es un entero que debe contener el identificador del socket a través del cual se reciben los datos. Este identificador es asignado por el sistema durante la creación de socket y el resultado que devuelve la función Socket ().

BUF: Esta entrada es un puntero al búfer donde Recv () almacena los datos recibidos. El búfer debe ser dimensionado de acuerdo con el tamaño de los paquetes que se recibirán. Los buffers de 1025 bytes son suficientes para las conexiones TCP.

Len: Este argumento es de tipo size_t y dice la función del tamaño del bufón recibir búfer.

banderas: Este entero contiene un conjunto de indicadores de control que dan a la función propiedades muy útiles. Los valores de estos indicadores se especifican mediante una máscara entre este entero y el indicador seleccionado, aplicando la operación o lógica entre ellos. Los valores que representan estas banderas y sus definiciones se pueden encontrar en el "Socket.encabezado. Vemos cada una de estas banderas y una breve descripción de ellas en lo siguiente:

Msg_oob = 0x01 procesa los datos fuera de banda.

Msg_peek = 0x02 se asoma a los mensajes entrantes.

Msg_ctrunc = 0x08 controla los datos perdidos antes de la entrega.

Msg_proxy = 0x10 suministra o pregunta la segunda dirección.

Msg_trunc = 0x20 Devuelve el tamaño del datagrama recibido. UDP solo.

MSG_DONTWAIT = 0x40 Rechazo sin bloqueo.

Msg_waitall = 0x100 espera una solicitud completa.

La función Recvc () se define en la carpeta "SYS" en el "Socket.encabezado. Necesitamos incluirlo en nuestro archivo de la siguiente manera:

#incluir

Cómo recibir datos a través de un socket con la función Recv () en el idioma C

En este ejemplo, conectamos un socket a www.Google.comunicarse, Envíe los comandos HTTP al servidor, reciba su respuesta utilizando el Recv () función y luego mostrarlo en la consola de comando.

La primera parte de este ejemplo es el conectar a() Función ... crea un socket TCP para el servicio HTTP, lo conecta al "www.Google.com ”dominio y devuelve el Socket_id identificador de socket. Dado que esto es todo lo que necesitamos para mostrar cómo Recv () funciona, no iremos más lejos en esta parte.

La segunda parte es la función principal donde, con el socket conectado, enviamos el comando al servidor con la función send () y luego obtenemos la respuesta en el búfer buf con el Recv () función.

Puede ver el código "principal" para esta aplicación y una explicación de cada paso que se muestra en la siguiente ilustración:

//Paso 1
#incluir
#incluir
#incluir
#incluir
#incluir
#incluir
#incluir
#incluir
int Connect_TO ();
int main ()
int Socket_id;
buffer de char [1025];
//Paso 2
Socket_id = Connect_TO ();
//Paso 3
mientras (1)
printf ("Enviar comando HTTP. Para salir presione ctrl+c \ n ");
FGETS (búfer, 1025, stdin);
enviar (Socket_id, buffer, 1025, 0);
memset (& buffer, '\ 0', 1025);
//Etapa 4
Recv (Socket_id, buffer, 1025, 0);
// Paso 5
printf ("%s \ n", búfer);
memset (& buffer, '\ 0', 1025);

// finalizar principal


Paso 1: Aquí, agregamos los encabezados requeridos, creamos la función principal y definimos el Socket_id entero que es el identificador de socket y el elemento 1025 buffer[] matriz de caracteres donde las funciones send () y recv () almacenan los datos que envían y reciben del servidor.

Paso 2: Después de definir las variables, llamamos al conectar a() función y pasar el Socket_id identificador como argumento de salida. La función regresa con un socket conectado y su identificador en Socket_id.

Paso 3: Con el enchufe y su manija conectados, creamos un mientras (1) bucle en el que la función fgets () espera que el usuario ingrese un comando http en la consola de comandos.

Cuando ingresa el comando, se envía al servidor a través del socket que se identifica por Socket_id Usando la función send ().

Etapa 4: Llama a Recv () función para obtener la respuesta del servidor. Al llamar a la función Recv (), enviamos el identificador de socket, Socket_id, Como argumento de primera entrada. Como el segundo y tercer argumento, enviamos el buffer[] Pointer de búfer y su tamaño en bytes en cuyo caso establecemos el tamaño de los paquetes en 1025. En este caso, establecemos la entrada de las banderas en 0.

Paso 5: El Recv () la función devuelve cuando termina recibiendo el paquete. Los datos recibidos del servidor se muestran en la consola de comandos imprimiendo el buffer[] contenido con la función printf (). La función MemSet () se usa para borrar el búfer después de que lo usa las funciones send () y recv ().

A continuación, vemos el código principal y la función Connect_TO ().

//Paso 1
#incluir
#incluir
#incluir
#incluir
#incluir
#incluir
#incluir
#incluir
int Connect_TO ();
int main ()

int Socket_id;
buffer de char [1025];
//Paso 2
Socket_id = Connect_TO ();
//Paso 3
mientras (1)
printf ("Enviar comando HTTP. Para salir presione ctrl+c \ n ");
FGETS (búfer, 1025, stdin);
enviar (Socket_id, buffer, 1025, 0);
memset (& buffer, '\ 0', 1025);
//Etapa 4
Recv (Socket_id, buffer, 1025, 0);
// Paso 5
printf ("%s \ n", búfer);
memset (& buffer, '\ 0', 1025);

// finalizar principal
/****************************************************** **************/
/* Función Connect_TO*/
int conect_to ()
Int Port = 80;
en terror;
int Socket_id;
buffer de char [1025];
Struct Hostent *servidor;
struct sockaddr_in cliente;
memset (& Server, 0, sizeof (servidor));
servidor = gethostByName ("www.Google.com ");
if (server == null)

printf ("\ nerror obteniendo datos de dominio.\norte");
regresar 1;

Socket_id = Socket (AF_Inet, Sock_stream, 0);
cliente.sin_family = AF_Inet;
cliente.sin_port = htons (puerto);
bcopy ((char *) servidor-> h_addr,
(char *) y cliente.sin_addr.s_addr,
sizeof (servidor-> h_length));
Error = Connect (Socket_id, (struct Sockaddr *) & Client, sizeof (cliente));
if (error < 0)
printf ("no podría establecer la conexión al servidor \ n");
Cerrar (Socket_id);
regresar 1;

printf ("\ nconnect to: %s \ n", inet_ntoa (cliente.sin_addr));
return Socket_id;


Crear un archivo llamado "Ejemplo.c "y guárdelo en" documentos ". Copie el código y péguelo allí. Guárdelo y compile el código en GCC con el siguiente comando:

~ $ GCC Documentos/Ejemplo.Ejemplo C -O


Luego, ejecute el programa con el siguiente comando:

~ $ ./ejemplo


La aplicación se conecta a “www.Google.com ”y espera a que presentemos un comando HTTP.


En la siguiente figura, vemos que el comando HTTP obtiene que se envía y la respuesta del servidor que es recuperada por el Recv () función en buffer[].

Cómo identificar los errores que la función Recv () puede generar en el lenguaje C

Los errores que pueden ocurrir al usar la función Recv () son variados, que van desde errores de red hasta tamaños de búfer incorrectos. Las definiciones de estos códigos y su representación numérica se pueden encontrar en el "Errno.encabezado h "en la carpeta" ASM-Genérica "y se puede recuperar accediendo a la errar entero.

Con el siguiente fragmento en el paso 4 del código anterior, llamamos al Recv () función desde una condición IF. Cuando se produce un error, un mensaje se imprime seguido por el número predefinido que identifica el error que se almacena en el errar entero:

//Etapa 4
if (Recv (Socket_id, Buffer, 1025, 0) < 0)
printf ("Error:%I", errno);


Las siguientes son las definiciones de los errores que pueden generarse mediante la función Recv () y una breve descripción de cada error:


La siguiente figura muestra el error que ocurre al intentar recibir los datos a través de un identificador de socket inexistente. El error resultante en errar es igual a 88 "operación de socket en no socket".

Conclusión

En esto Pista de Linux Artículo, explicamos cómo usar la función Recv () para recibir los datos a través de un socket. Observamos la sintaxis de esta función, así como una descripción de cómo funciona, los argumentos de entrada y salida, y los tipos de datos que aceptan.

Para ver cómo funciona esta función, creamos una aplicación de consola en la que utilizamos la función Recv () para recibir la respuesta de un servidor a través de un socket que está conectado a ella. También le mostramos cómo identificar y clasificar algunos de los errores más comunes al usar esta función.

Esperamos que hayas encontrado este artículo útil. Para obtener más artículos sobre el lenguaje C y los consejos de Linux, use el motor de búsqueda en nuestro sitio web.