Programación en red Linux - funciones completas de lectura y escritura

  

Noticias de la tienda de informática

1 Función de escritura write ssize_t write (int fd, const void * buf, size_t nbytes) La función de escritura escribe el contenido del byte nbytes en el buf al descriptor de archivos fd. El número de bytes escritos. Devuelve -1 si falla y establece la variable errno. En el programa de red, hay dos posibilidades cuando escribimos en el descriptor del archivo de socket: 1) El valor de retorno de escritura es mayor que 0, lo que indica que está escrito. Parcial o todos los datos. 2) El valor devuelto es menor que 0. En este momento, se produce un error. Necesitamos procesar según el tipo de error. Si el error es EINTR, indica que se produjo un error de interrupción durante la escritura. Si el IPIPE indica que aparece la conexión de red. El problema (la otra parte ha cerrado la conexión). Para solucionar la situación anterior, escribimos una función de escritura para manejar estas situaciones. Int my_write (int fd, void * buffer, int length) {int bytes_left; int written_bytes; char * ptr; ptr = buffer; bytes_left = length; while (bytes_left > 0) {/* Comience a escribir * /written_bytes = write (fd, ptr, bytes_left); if (written_bytes < = 0) /* Error * /{ Si (errno == EINTR) /* Error de interrupción Continuamos escribiendo * /written_bytes = 0; else /* No hay forma de que se produzcan otros errores, tenemos que retroceder * /return (-1);} bytes_left- = written_bytes; ptr + = written_bytes; /* Continuar escribiendo desde el resto del lugar * /} return (0);} 2 Leer función leer ssize_t leer (int fd, void * buf, size_t nbyte) La función de lectura es responsable de leer el contenido de fd. Cuando la lectura es exitosa, Read devuelve el número de bytes realmente leídos. Si el valor devuelto es 0, indica que se ha leído el final del archivo. Si es menor que 0, indica que se ha producido un error. Si el error es EINTR, la lectura se debe a la interrupción. Si es ECONNREST, se indica la conexión de red. Algo salió mal. Como anteriormente, también escribimos una función de lectura propia. Int my_read (int fd, void * buffer, int length) {int bytes_left; int bytes_read; char * ptr; bytes_left = length; while (bytes_left > 0 ) {bytes_read = leído (fd, ptr, bytes_read); if (bytes_read < 0) {if (errno == EINTR) bytes_read = 0; else else (-1);} else if (bytes_read == 0) break; bytes_left- = bytes_read; ptr + = bytes_read;} ​​return (length-bytes_left);} 3 Transferencia de datos Con las dos funciones anteriores , podemos pasar datos al cliente o al servidor. Por ejemplo, debemos pasar una estructura. Puede usar la siguiente manera /* cliente escribe en el servidor * /struct my_struct my_struct_client; write (fd, (void *) &My_struct_client, sizeof (struct my_struct); /* server-side read * /char buffer [sizeof (struct my_struct)]; struct * my_struct_server; read (fd, (void *) buffer, sizeof (struct my_struct)) my_struct_server = (struct My_struct *) búfer; cuando se pasan datos a la red, generalmente los convertimos en transferencia de datos de tipo char. Lo mismo ocurre cuando se recibe. No necesitamos pasar punteros a la red (porque los punteros de paso no tienen ningún sentido) , debemos pasar el puntero al contenido)

Copyright © Conocimiento de Windows All Rights Reserved