Loading

Module 1: Transmisión y programación

Apuntes
Study Reminders
Support
Text Version

Programación de socket: TCP

Set your study reminders

We will email you at these times to remind you to study.
  • Monday

    -

    7am

    +

    Tuesday

    -

    7am

    +

    Wednesday

    -

    7am

    +

    Thursday

    -

    7am

    +

    Friday

    -

    7am

    +

    Saturday

    -

    7am

    +

    Sunday

    -

    7am

    +

Programación de socket: TCP
Así que, bienvenido de nuevo al curso en Red de Sistemas y Protocolos de Internet y en la última clase de, estamos discutiendo acerca de la programación de socket en la conferencia de hoy en día, volveremos acontinuar con la programación de socket en detalles. Por lo tanto, en la última clase hemos mirado enel socket UDP, hemos mirado en la programación básica de socket junto con el servidor UDP dey el cliente UDP en detalles de cómo puede utilizar este concepto de datagrama de socbajo el socket de datagrama para transferir datos de recepción de datos utilizando el protocolo UDP. Por lo tanto,hoy nos fijamos en cómo puede hacer lo mismo utilizando el protocolo TCP y miramos endiferentes variantes del servidor TCP.(Consulte el tiempo de la diapositiva: 00:57)(Consulte el tiempo de la diapositiva: 01:11)Así que, primero veamos la demostración de la demostración sobre el servidor TCP y un cliente TCP. Por lo tanto,primero vemos en este servidor TCP la fuente del servidor TCP en detalles, así que nose confunda con la flecha final. Por lo tanto, estos son C programa no obtener con esta flecha final yeste punto sólo un formato que hemos utilizado para nuestra claridad de escribir el código. Por lo tanto, este es su códigoC bien.(Consulte el tiempo de la diapositiva: 01:35)Así que, tenemos esta cabecera relacionada con la red, que se incluye seguida de la función principal de, por lo que, en la función principal similar a la UDP1, el servidor UDP que hemos discutido, estamos declarando una dirección de servidor primero, la variable de dirección del servidor de tipostruck sockaddr en y el descriptor de archivo para almacenar el ID de socket que se creará y esto esla sintaxis de que cómo debe utilizar el código, estamos tomando el número de código del argumento de la línea de comandos dey luego estamos tomando el número de puerto de la línea de comandos argumento y estamos creando el socket por esta llamada del sistema de socket.Por lo tanto, esta llamada del sistema de socket similar al caso anterior tomará un finito como la familia de protocolo, pero el tipo de socket es ahora SOCK STREAM en estado de SOCK DGRAM. Por lo tanto, yfinalmente, es un campo de protocolo que es 0 y como le he pedido anteriormente, que intente explorar esepor qué utilizamos principalmente el tipo de protocolo de la familia de protocolo como 0.Ahora si el socket no se ha creado satisfactoriamente algún mensaje de error que se está imprimiendoy después de que estamos inicializando el campo de dirección del servidor, la familia de protocolos de la familia de servidoreslo estamos estableciendo como AF INET, porque vamos a utilizar la direcciónde IPv4 seguida de la dirección del servidor o la dirección del servidor que estamos tomando comoINADDR_ANY. Por lo tanto, este INADDR ANY nos ayudará a tomar la dirección del host localentonces, estamos proporcionando el número de puerto que se han tomado del concepto.Por lo tanto, hemos inicializado la dirección del servidor. Por lo tanto, una vez que haya inicializado la direccióndel servidor, deberá enlazarla con el socket. Por lo tanto, estamos haciendo una llamada al sistema de vinculación. Por lo tanto,la llamada al sistema de vinculación puede fallar en algún momento porque, si va a utilizar el mismo número de puertoque está siendo utilizado por otra aplicación, hay otras razones en las que una llamada de enlacepuede fallar. Por lo tanto, si el enlace falla, estamos teniendo un mensaje de error de que no se puede enlazar con quede lo contrario, el enlace ha sido satisfactorio. Y el enlace está tomando el formato como hemos comentadoanteriormente el descriptor de archivo de socket la dirección del servidor y el tamaño de la variable de dirección del servidor.Ahora estamos haciendo una llamada de escucha, la llamada de escucha aquí estamos proporcionando el socket y el descriptor de archivo de sockety hemos especificado 5 como el número máximo de conexiónque puede ser backlogged en la llamada de escucha. Por lo tanto, este concepto de conexión de reserva es que,el servidor puede manejar un cliente a la vez. Por lo tanto, siempre que esté tomando el cliente de conexión uno, durante ese tiempo el cliente múltiple puede volver a intentar simultáneamente, sólo pensar en el escenariode un servidor web, donde miles de solicitudes están llegando al servidor web porsegundo.Así que, durante ese tiempo cuando el servidor está ocupado en la ejecución de esto, la llamada de escucha para una conexión dedurante ese tiempo la otra conexión recibirá backlog.  Ahora, en el lado del bucle, lo que estamos haciendo, estamos haciendo que la aceptación sea llamada en el lado del servidor, ahora TCP es un servicio orientado a la conexión que es, por qué tienes que hacer la llamada de conexión desde el lado del cliente y aceptar la llamada del lado del servidor para iniciar la conexión,que utilizará el handshaking de tres vías del protocolo TCP. Por lo tanto, después de que estemoshaciendo que la aceptación llame a la llamada de aceptación, estamos pasando el parámetro como el descriptordel archivo de socket, la dirección del cliente y una longitud de la dirección del cliente si hay un error.Así que, toda esta función si hay un error, devuelven algún número negativo. Por lo tanto, es por eso quepuede comprobar el valor de retorno si es inferior a 0; eso significa que se ha producido un error.Ok. Por lo tanto, después de que una vez que se acepta la conexión, estamos imprimiendo queha recibido una nueva conexión de la dirección del cliente, estamos especificando la dirección del clientey el puerto del cliente. Por lo tanto, desde esa dirección de cliente en particular y el puerto del cliente se ha recibido una nueva conexión dey después de eso estamos teniendo un bucle, donde estamos recibiendolos datos del nuevo socket que se ha creado.Ahora, aquí también mientras está haciendo la llamada de aceptación, en la llamada de aceptación, devuelve el nuevo descriptor de archivoy este nuevo descriptor de archivo iniciará esta conexión de extremo a extremo, entre el servidor dey el cliente. Por lo tanto, devuelve un nuevo descriptor de socket que usaremos en el envío deo en los datos de recepción, que es específico de un conducto o específico de un socket entre un servidory el cliente correspondiente.Ahora, si receiveLen es igual a 0; esto significa que no está recibiendo ningún datodel cliente. Por lo tanto, puede cerrar esta conexión en particular. De lo contrario, obtendrá los datosy los pondrá en los datos que recibe en el lado del servidor y, después de eso, realmenteson los datos que hemos recibido, estamos requiriendo los mismos datos al cliente utilizando esta misma función de. Por lo tanto, ha recibido los datos, que se almacenan en el almacenamiento intermedio recibidolos mismos datos se decodifican de nuevo al lado del cliente.Ok, en el lado del cliente, las cosas son bastante similares en lo que estamos declarando el socket que estamoscreando un nuevo socket y después de crear el nuevo socket, estamos obteniendo el aquí en el lado del cliente, estamos recibiendo el IP del servidor o el nombre de host del servidor y el puerto del argumento de la línea de comandos de. Por lo tanto, estamos utilizando ese argumento de línea de mandatos para crear la dirección del servidor de.Así que inicializa la conexión con el servidor utilizando el procedimientode tres vías de conexión TCP. Ahora, después de que se haya realizado la llamada al sistema de conexión, ha iniciado la conexióncon el servidor y, a continuación, realiza la llamada a la función de envío, la función de envío aenvía los datos. Por lo tanto, estamos creando un mensaje que se llama hola allí este mensaje en particular,estamos enviando al servidor y como usted ha visto en el código del servidor que el servidorrealmente va a devolver esa cosa en particular al cliente.Así que, después de que usted está enviando que usted está recibiendo el mensaje. Por lo tanto, estamos declarando un almacenamiento intermedio decomo una matriz de caracteres, vamos a obtener los datos en forma de una matriz de caracteres o una serie de. Por lo tanto, estamos declarando que buffer para eso y después de eso estamos haciendo una llamadade recepción, esta recibe llamada sobre ese descriptor de archivo de socket que obtendrá los datos del lado del cliente.Así que desde el lado del servidor así como usted ha visto en el código del servidor, el servidor realmente va adatos que usted está enviando, aquí usted está enviando este hola función,mismo hola allí la función será devuelto. Por lo tanto, recibirá esos datos y después de quereciba esos datos, imprimirá esos datos concretos en el concepto. Por lo tanto, ese es el código para el lado del cliente.Ahora, vamos a compilar y ejecutar estas dos cosas. Por lo tanto, primero recopile el servidor TCP y el cliente TCP de compilación de. Por lo tanto, primero vamos a ejecutar el servidor. Por lo tanto, necesitamos especificar la dirección del puerto. Por lo tanto, estamos dando la dirección de puerto como 2444, el servidor ahora el servidor esque se ejecuta allí. Por lo tanto, una vez que el servidor se está ejecutando allí desde el lado del cliente, podemos darel servidor se está ejecutando en mi máquina.Así que, estoy dando el nombre de host del servidor como host local y el correspondiente puerto del servidor que,hemos utilizado aquí 2444. Por lo tanto, ha recibido el mensaje y en el lado del servidor puedever que, ha recibido una nueva conexión de la máquina local, la IP es 127.0.0.1 yun puerto de 47676. Por lo tanto, ha recibido este mensaje de bienvenida, lo ha devuelto y el cliente deha recibido ese mensaje.Así que, aquí verá que estas conexiones. Por lo tanto, aquí estamos haciendo un bucle while ydentro de este bucle while, estamos aceptando la conexión.Por lo tanto, cómo funcionará todo esto si la ecuación de cliente múltiple viene simultáneamenteentonces, se tomará un cliente que esa conexión se llevará a cabo.Entonces se tomará el siguiente cliente, que se ejecutará, entonces el tercer cliente serátomado, que se ejecutará y de esa manera todo esto seguirá.  Le sugeriré que mire en este concepto de proceso en el sistema operativo y lo mire en los detalles de. Por lo tanto, utilizaremos este concepto de proceso en el sistema operativo para examinar esta implementación dede servidores simultáneos en los servidores paralelos. Así que, como hemos vistoanteriormente, está creando múltiples conexiones de este tipo.Ahora, si varios clientes están intentando conectarse al servidor de forma simultánea, entonces cómo lo hará. Por lo tanto, una forma de manejarlo es utilizar el servidor iterativo, pero comohemos visto que el servidor iterativo puede no ser muy útil. Por lo tanto, implementamos el servidorparalelo utilizando este concepto de varios procesos en el sistema operativo.
Programación de socket: TCP-Parte 2
Así que la idea es algo así que tiene un proceso de servidor, que tiene el socketpadre y, a continuación, puede hacer una llamada al sistema de bifurcación. Por lo tanto, en el sistema operativo, esta llamada del sistema de bifurcacióncrea un proceso hijo. Por lo tanto, lo que puede hacer una vez que acepte una conexión, puede hacer que esta llamada al sistema de bifurcación cree un proceso hijo, que en realidadmanejará la transmisión de datos y la recepción de datos de esa conexión hijo en particular.Si no está haciendo eso, si lo está haciendo en la forma anterior que estamos haciendo dentro deel bucle while en forma de servidor iterativo, entonces el tiempo hasta que un servidor en particular essigue enviando y recibiendo datos, no está cerrando la conexión hasta ese punto la conexiónpermanecerá bloqueada. Por lo tanto, el servidor no podrá manejar la segunda conexión dehasta que se complete la primera conexión.Por lo tanto, es por eso que la idea es que, cada vez que se viene una nueva conexión, se hace una llamada al sistema de bifurcacióny después de hacer una llamada al sistema de bifurcación tienen un proceso hijo, ese proceso hijoque es la parte del proceso del servidor, pero que creará un socket hijo que será. Por lo tanto,hemos visto que después de realizar una llamada de aceptación en el sitio del servidor, devuelve un nuevo identificador de socket, que se utiliza para enviar o recibir datos al cliente.Así que, se pasa ese nuevo descriptor de archivo de socket en particular al socket hijo, quemanejará la transmisión y recepción de datos en paralelo. Por lo tanto, la idea amplia aquí es que se obtienentodas las conexiones una tras otra, pero no se espera la funcionalidad enviar y recibirde nuestras conexiones individuales y mantener otras conexiones en la colaen espera. Por lo tanto, cree un proceso hijo y ese proceso hijo lo llamaremos como un sockethijo, que manejará las funcionalidades de envío y recepción de datos de la solicitud individual del clienteque está recibiendo.(Consulte el tiempo de la diapositiva: 18:32)Por lo tanto, esa fue nuestra implementación del servidor iterativo que hemos realizado, tenemos un buclemientras que, dentro del bucle while que está haciendo una llamada de aceptación, tiene el envíoy recibe y es ineficiente porque hasta que no esté completo que envíe y reciba las funcionalidades de, no podrá salir de eso y obtener o hacer la llamada de aceptación de nuevo para aceptar la nueva conexión entrante.Por lo tanto, si observa que el servidor iterativo funciona que la llamada de escucha establece un distintivo que,el socket está en estado de escucha y establece el número máximo de conexiones de reservaque ha visto anteriormente, la llamada de aceptación bloquea un socket receptor, hasta que una nueva conexión deentra en la cola de conexión y se acepta. Por lo tanto, esta llamada de aceptación es una llamada de bloqueo de. Por lo tanto, el sistema seguirá esperando aquí hasta que realice una llamada de conexióndesde el lado del cliente. Por lo tanto, es una llamada de bloqueo.Ahora, una vez que se acepta esta nueva conexión, el nuevo descriptor de archivo de socket dice, la conexiónfd se escribe, que se utiliza para leer y escribir datos o para enviar y recibir datos deal socket conectivo. Ahora, toda la otra conexión, que viene en esta duración, esbacklogged en la cola de conexión, porque el proceso está ocupado dentro de este bucle while aenviar y recibir datos.  Ahora, extendemos este servidor iterativo a un servidor simultáneo. Por lo tanto, nuestra idea es que el proceso paralelode cada socket entrante, para que la llamada de aceptación se ejecute con más frecuencia.Entonces, ¿qué hacemos aquí? Aquí usted ve que después de que estamos haciendo esta llamada de aceptación, que esque devuelve el nuevo descriptor de archivo de socket entonces, hemos aceptado con éxito una conexiónde cliente y luego hacemos una llamada al sistema de bifurcación. Por lo tanto, esta llamada al sistema de bifurcación en el proceso padre, devuelve la idea del proceso hijo y en el proceso hijo devuelve 0.Así que, siempre que esté realizando esta llamada al sistema de bifurcación y si la llamada al sistema de bifurcación está devolviendo0; eso significa que está dentro del proceso hijo. Ahora este proceso hijo, ¿qué hace? cierra el socket original del socket del servidor y utilizará este nuevo socket fd que ha obtenidopara enviar y recibir datos. Por lo tanto, cierra el socket antiguo ya que toda la comunicación seráa través del nuevo socket y luego inicializa el almacenamiento intermedio, copia el mensaje a él, envía ohacer el recibo lo que quieras hacer.Ahora, lo que pasará aquí que lo que sea que esté dentro de la llamada del sistema de bifurcación, dentro de este bloque de bifurcaciónen este si bloque que ejecutará se ejecuta en paralelo. Por lo tanto, en el proceso padreel proceso padre no será así para el proceso padre, esto recibirá el retorno false,porque padre la bifurcación de proceso padre devuelve el ID del proceso hijo y en la bifurcación de proceso hijodevuelve 0.Así que, en el proceso padre volverá a regresar y el proceso padre volverá a veniraquí y realizar la siguiente llamada de aceptación. Por lo tanto, el proceso padre ahora no necesita esperar a queenvíe y reciba funcionalidades, que serán manejadas por un proceso hijo.Ahora, vamos a ver la demo de esta. Por lo tanto, aquí no hacemos ningún cambio en la implementación del cliente. La implementación del cliente permanece como antes, sólohará cambios en la implementación del servidor. Por lo tanto, en la implementación del servidor, por lo que el cambio deque, hemos hecho todo el código es similar si usted mira en que estamosdeclarando esta dirección del servidor, seguido por una llamada de socket entonces inicializando las direcciones enel campo de dirección del servidor, haciendo una llamada de enlace, haciendo una llamada de escucha para transmitir el o no aen realidad la transmisión de esto puede no ser un término correcto para anunciar el puerto donde el servidor estáen realidad escuchando y después de eso hacer que sock opt llamada como antes y luego dentro deeste bucle while, donde usted está aceptando aceptar la conexión que estamos aceptando aceptar una nueva conexión y se va a este hijo fd estamos creando un nuevo archivodescriptor.Después de que usted ve que estamos haciendo una llamada de bifurcación. Por lo tanto, busca en esta sentencia forreturn equal to fork. Por lo tanto, estamos haciendo una llamada de bifurcación que creará un proceso hijo, ahorale sugeriré que mire en este concepto de sistema operativo en detalles, no tenemos el alcance depara discutir eso, la idea aquí es que cada vez que usted está haciendo una llamada de bifurcación, todo este códigoserá copiado también en el proceso hijo. Entonces, ¿el niño procesa lo que hará? Enel proceso hijo, la llamada de bifurcación devolverá un 0 y en el proceso padre la llamada de bifurcación devolveráel ID del proceso hijo.Por lo tanto, dentro del proceso hijo esta parte del código se ejecutará. Ahora ve esto el segundo bucle whileque teníamos que realmente trata de enviar y recibir datos, esdentro de sólo el proceso hijo. Por lo tanto, está dentro de esto si aquí estamos haciendo que esta llamada recibay una llamada de envío.Y estamos teniendo ese manejo en paralelo en el lado del servidor. Por lo tanto, en el lado del servidor, esteen particular si el bloque no se ejecuta, porque en el servidor del lado padre, el socketpadre no se ejecutará, porque el socket padre devolverá el ID del hijo. Por lo tanto, no será igual a 0.Por lo tanto, esta parte sólo se ejecutará en el proceso hijo. Así que el proceso hijo ahora está tratandocon el envío y la recepción de los datos, pero el proceso padre puede salir de eso, el proceso padre deno se bloquea en este segundo bucle, sino que puede salir directamentey aceptar la siguiente conexión.Por lo tanto, es posible que no tengamos una sensación de esta ejecución paralela, pero lo que está sucediendo allí.Un nuevo proceso hijo se crea y maneja esta petición individual que estamosaquí.Ahora en este caso en particular, lo que puede suceder que no tengamos ningún servidor central paracontrolar la entrega de mensajes de chat, cada usuario corre es un servidor de chat propio; esto significa queejecuta el servidor TCP para las conexiones entrantes y los mensajes entrantes, ahora enUNIX, mantiene todas las conexiones como un descriptor de archivo que ya hemos visto.Ahora, en ese momento en un servidor de chat tiene un requisito típico que necesita también paraleer datos de la entrada estándar. Por lo tanto, es necesario escribir algo. Por lo tanto, cuando se estárecibiendo un mensaje durante ese tiempo, se está escribiendo algo.  Así que está bien para que usemos este concepto en la llamada al sistema seleccionado, que es de nuevo una llamada al sistema de nivel del sistemaoperativo.Así que la llamada al sistema seleccionado, selecciona de un descriptor de archivo múltiple, que es una formaconcurrente de manejar múltiples descriptores de archivos simultáneamente incluso desde un único proceso. Por lo tanto,puede obtener los datos del socket, que es uno de los descriptores de archivo, así como el descriptor de archivo de tecladosimultáneamente.Ahora, lo que hemos visto, lo que sucede en una implementación de servidor iterativo quehemos hecho anteriormente, la llamada de aceptación está bloqueada hasta que haya completado la lectura ylas llamadas de grabación. Ahora, si realiza varias actividades de lectura y escritura después de aceptar una conexión de entrada de, que las otras conexiones están bloqueadas y a la espera de la cola de conexión de, es posible que se pongan de hambre. Ahora seleccione es la forma de romper este bloqueo.Por lo tanto, una forma de romper el bloqueo es utilizar esta implementación en paralelo de otra manera parahacer esa cosa es utilizar la llamada del sistema de selección. La ventaja con esta selección de sistema de selección esque, no es necesario crear varios procesos hijo, ahora no es necesario preocuparsede los zombies. Por lo tanto, los procesos hijo siempre tienen un problema que si es que alguna vezel proceso padre se mata o el proceso padre se detiene, el proceso hijo se convierte en zombie de. Por lo tanto, con la llamada del sistema de selección no es necesario preocuparse por este zombi. Por lo tanto,puede gestionar recursos de forma más eficiente
Programación de socket: TCP -Parte 3
Por lo tanto, esto selecciona la llamada al sistema que no es más que un multiplexor.
Por lo tanto, lo que sucede que tiene varios descriptores de archivo, tiene ciertas señales y el tiempo de salida dede este descriptor de archivo múltiple, selecciona uno del descriptor de archivo. Por lo tanto,descubre que entre este descriptor de archivo que uno está activo actualmente y que selecciona ese descriptor de archivo particular de.Así que, aquí está el formato de la llamada al sistema seleccionado, en la llamada al sistema de selección que está proporcionandoel número de descriptor de archivo, es el número más alto de descriptor de archivo en cualquiera de los tres conjuntos demás 1, tenemos tres conjuntos diferentes de descriptor de archivo, el descriptor de archivo de lectura para leeralgo como una entrada, el descriptor de archivo de escritura para escribir algo en la salida yexcepto el descriptor de archivo para manejar las excepciones.Así, este archivo descriptores son una especie de estructura llamada fd set y tenemos un valor de tiempo de espera.Por lo tanto, el valor de tiempo de espera es que si no está obteniendo nada de este descriptor de archivo paraeste valor de tiempo de espera. Así, saldrá de las cosas.Por lo tanto, en realidad le está proporcionando una multiplexación de E/S síncrona sobre la entrada asíncrona.Por lo tanto, como hemos mencionado anteriormente que su entrada puede ser asíncrona, puede obtener un mensaje desobre el socket mientras está haciendo la escritura, pero le proporciona una multiplexación depara seleccionar el teclado o el socket a una distancia de tiempo.Por lo tanto, tiene tres diferentes descriptores de archivo que cada descriptor de archivo se verá para versi los caracteres están disponibles para la lectura, el descriptor de archivo de escritura se verá para versi los espacios disponibles Ahora tenemos un valor de tiempo de espera, el intervalo que selecciona debe bloquear la espera de que un descriptorde archivo esté listo, ahora la llamada select permanece en bloque o bien el descriptor de archivoqueda listo o la llamada es interrumpida por un manejador de señal o un tiempo de espera excedido. Por lo tanto, encualquiera de los casos sale de la selección. Por lo tanto, siempre que uno de los descriptores de archivoesté listo sale de la llamada de selección, si esa llamada en particular es interrumpida por otras señaleso el tiempo de espera. Por lo tanto, este es el procedimiento para establecer el tiempo de espera queproporcione el valor en forma de segundos y microsegundos.(Consulte la hora de la diapositiva: 32:59)Ahora, ¿cómo se pasa el descriptor de archivo a seleccionar? Así que para que lo que hacemos, primeroinicializar el conjunto de descriptores de archivo set fd, que es un mapa de bits de tamaño de arreglo con este fd 0, entonceshacer la llamada a fd set. Por lo tanto, si este conjunto de fd selecciona un descriptor de archivo, mi socket que tengodefinido y el correspondiente al descriptor de archivo, que donde se está obteniendo el socket. Por lo tanto, este bit en particular corresponde a este descriptor de archivo de socket que se establecerá;es decir, algunos datos están disponibles allí.(Consulte la hora de la diapositiva: 33:42)Ok, haga la llamada de selección así que, ¿cómo funciona la selección? Por lo tanto, examina todo el descriptor de archivopara cada descriptor de archivo que llama al método de sondeo de descriptor de archivo. Por lo tanto, este método de sondeoes para comprobar que si hay algo disponible o algún suceso está esperando enese descriptor de archivo. Por lo tanto, añadirá el llamante a esa cola de espera de descriptor de archivo y a la devolución,qué sucesos se aplican actualmente a ese descriptor de archivo si es descriptor de archivo eslegible.Si es un descriptor de archivo de lectura si es grabable, si es un descriptor de archivo de grabación o se ha producido alguna excepción de. Ahora si alguno de los descriptores de archivo coincide con la condición de que el usuario deestaba buscando lectura, escritura o excepción, la selección simplemente escribiráinmediatamente, después de actualizar el conjunto de descriptor de archivo apropiado que el usuario ha pasado y sino la selección se va a dormir para el valor de tiempo de espera una vez, el tiempo de espera se produciráde esa llamada de selección.(Consulte la hora de la diapositiva: 34:43)Y si se producen algunos otros sucesos dentro de ese suceso de tiempo de espera, hará que este conjunto de FD ysalgan de eso. Y durante ese intervalo, si se produce un suceso interesante en cualquiera de los descriptores de archivos deque seleccione está a la espera de que el descriptor de archivo notifique su cola de espera. Por lo tanto,esto hará que la hebra que duerme dentro de la selección de selección y que repita el bucle anterior dey vea cuál de los descriptores de archivo ya están listos para ser devueltos al usuario.Ahora, el valor de retorno de la selección tenemos tres valores si es menos 1 significa que se ha encontrado algún error. 0 significa que el tiempo de espera ha pasado y mayor que 0 significa queque el número de sockets que tiene el suceso pendiente como lectura o excepción de lectura. Por lo tanto, paracuántos sockets está pendiente de suceso, si va a leer o escribir otiene una determinada excepción.(Consulte la hora de la diapositiva: 35:23)Así que, después de seleccionar las devoluciones, puede utilizar la función denominada FD establecida para probar si un descriptorde archivo forma parte de dicho conjunto. Por lo tanto, puede comprobar si se ha establecido un descriptor de archivo ono si el descriptor de archivo se ha establecido; es decir, tiene algo que leer, si es un descriptor de archivode lectura o si tiene algo que escribir si es un descriptor de archivo de grabación.(Consulte la hora de la diapositiva: 35:55)Así que, veamos un código que utilice esta llamada de selección. Utilizaremos la misma implementacióndel servidor TCP con esta selección.(Consulte el tiempo de la diapositiva: 36:18)Por lo tanto, la parte base del código es la misma que antes estamos declarando la dirección del servidor, la llamada de enlace, la llamada de escucha en el lado del servidor la llamada set sock opt y después de eso estamosdeclarando el descriptor de archivo. Por lo tanto, aquí estamos declarando que podemos tener un máximo de16 descriptor de archivo diferente y este fd len devuelve, que cuántos son cuántos de tal archivodescriptor están actualmente establecidos o activos actualmente.Por lo tanto, estamos declarando el conjunto de descriptor de archivo y el descriptor de archivo máximo que esigual al descriptor de archivo de socket actual. Ahora, dentro de este bucle while, primero inicializamosel descriptor de archivo, aquí sólo vamos a utilizar el descriptor de archivo de lectura porque estamosyendo a leer datos del socket y estamos estableciendo a través de esta llamada de conjunto fd, estamosestableciendo el descriptor de archivo de lectura corresponde al socket que hemos definido o el socketdonde el servidor está realmente escuchando.Ahora, estamos en bucle sobre el descriptor de archivo disponible. Por lo tanto, aquí la idea es que cada vez queestamos recibiendo una nueva conexión, lo estamos añadiendo dentro del descriptor de archivo dentro de ese conjunto de descriptores de archivos.(Consulte el tiempo de la diapositiva: 37:25)Después de eso estamos haciendo una llamada de selección. Por lo tanto, como hemos visto antes que no estamosdando ningún valor de tiempo de espera, porque no estamos dando ningún valor de tiempo de espera. Por lo tanto, mantendrá aen espera de una duración infinita, siempre que ocurra algún evento, entonces sólo saldrá. Por lo tanto, estamos inicializando con estos descriptores de archivo de lectura.Así que cada vez que llegue una nueva conexión, llegará a este descriptor de archivo de lecturaa través de este bucle y luego seguirá esperando aquí, cuando se produzca algún evento que la función antigua dese desencadene y que vuelva a funcionar la función antigua, si cierto evento esallí en los descriptores de archivo de lectura ciertos medios de evento, si ese socket en particular estálisto para leer los datos.Y después de eso si selecciona devoluciones; eso significa, algún socket está listo para leer los datos entoncesrevisa usando fd set, ya sea ese particular socket está preparado para leer los datos si ese socket deestá preparado para leer los datos, entonces hace una llamada de aceptación, acepta la llamada para aceptar queuna conexión en particular que significa, alguna conexión está esperando que acepte esa conexióny después de hacerlo, la forma en que estamos cerrando el descriptor de archivo hijo y, a continuación, añadir queen este bucle de descriptor de archivo.(Consulte el apartado Tiempo de la diapositiva: 38:52)Entonces, en este juego de fd se conecta a todo el descriptor de archivo que se le ha añadido.Por lo tanto, si se ha recibido len es igual a 0; eso significa que no está recibiendo ningún dato.Por lo tanto, cierre el Por lo tanto, todo esto se trata de nuestra discusión en el servidor TCP, fui bastante rápido al describir las cosascon el supuesto de que usted tiene un conocimiento básico de programación C y sistema operativo, vamos a compartir todos los códigos con usted y le sugeriré que examine el códigoy busque en los tutoriales que hemos compartido.Y si usted tiene alguna duda o cualquier cosa se siente libre de publicar las preguntas en el foro. Por lo tanto,con esta programación de socket en particular, puede desarrollar sus propias aplicaciones que puedeincluso implementar la aplicación de servidor de conversación de la que estamos hablando. Por lo tanto, le sugeriréque mire en eso e implemente múltiples aplicaciones de este tipo con la ayuda dede esta diferente varianza de programación de sockets.Así que, gracias a todos por asistir a esta clase; de la siguiente clase en adelante, vamos a volver a buscarlos aspectos teóricos de la pila de protocolos TCP/IP.Así que gracias a todos por asistir a esta clase.