Loading

Module 1: Transmissão e Programação

Nota de Estudos
Study Reminders
Support
Text Version

Programação 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

    +

Programação de Soquete: TCP
Então, bem-vindo de volta ao curso em Rede de Computadores e Protocolos da Internet e naúltima aula, estamos discutindo sobre a programação de socket na palestra de hoje ’ s ó vamos novamentecontinuar com a programação de socket em detalhes. Assim, na última aula analisamos emo soquete UDP, analisamos o básico da programação de socket juntamente com o servidorUDP e o cliente UDP em detalhes que como você pode usar este conceito de socdatagrama sob o soquete do datagrama para transferir dados recebem dados utilizando o protocolo UDP. Então,hoje analisamos como você pode fazer a mesma coisa usando o protocolo TCP e nós olhamos paradiferentes variantes do servidor TCP.(Consulte o Tempo do slide: 00:57)(consulte o tempo do slide: 01:11)Então, primeiro deixe-nos olhar para a demo de demo sobre o servidor TCP e um cliente TCP. Então,primeiro nós olhamos para este servidor TCP a origem do servidor TCP em detalhes, bem assim nãoficar confuso para ele finalizar seta. Então, estes são programas C não se obtêm com esta seta de ponta eeste ponto apenas uma formatação nós temos usado para a nossa clareza de escrever o código. Então, este é o seu código deC bem.(Consulte o Slide Time: 01:35)Então, temos esse cabeçalho relacionado à rede, que estão sendo incluídos seguido da função principalso, na função principal similar ao UDP1, servidor UDP que temosdiscutido, estamos declarando um endereço do servidor primeiro, endereço de servidor do tipoatingiu sockaddr em e descritor de arquivo para armazenar o id do socket que será criado e este éa sintaxe de que como você deve usar o código, estamos tirando o número do código de comandose então estamos tirando o número da porta de linha de comando argumento e estamos criando o socket por esta chamada de sistema de socket.Então, esta chamada de sistema de socket semelhante ao caso anterior ele vai levar um finito como a família do protocolo, mas o tipo socket agora é SOCK STREAM em estado de SOCK DGRAM. Então, efinalmente, é um campo de protocolo é 0 e como eu pedi anteriormente que tente explorar issopor que usamos principalmente protocolo da família de protocolo como 0.Agora se o socket não for criado com sucesso alguma mensagem de erro que está ficando impressae depois disso estamos inicializando o campo de endereço do servidor a família de protocolo famíliaestamos definindo como AF INET, pois vamos utilizar o endereço IPv4seguido do endereço do servidor ou endereço do servidor estamos tomando comoINADDR_ANY. Então, este INADDR ANY vai nos ajudar a tirar o endereço do hospedeiro localentão, estamos fornecendo o número da porta que são retirados do conceito.Então, iniciamos o endereço do sever. Então, uma vez que você tenha inicializado o endereço do servidor, você tem que ligá-lo com o soquete. Então, estamos fazendo uma chamada de sistema de ligação. Assim,a chamada do sistema de ligação pode falhar algum dia porque, se você for utilizar a mesma portanúmero que está sendo usado por outro aplicativo, há outras razões onde uma chamada de ligaçãopode falhar. Portanto, se a ligação falhar, estamos a ter uma mensagem de erro de que é falha em ligar quecaso contrário, a ligação foi bem-sucedida. E a ligação está tomando o formato como temosdiscutiu anteriormente o descritor de arquivo de socket o endereço do servidor e o tamanho da variável de endereço do servidor.Agora estamos fazendo uma chamada de atendimento, a chamada de atendimento aqui estamos fornecendo o descritor de arquivo socket esocket e nós especificamos 5 como o número máximo de conexãoque pode ser backlogado na chamada de atendimento. Então esse conceito de conexão de backlog é que,o servidor pode lidar com um cliente de cada vez. Assim, sempre que estiver tomando a conexão um cliente, durante esse tempo o múltiplo cliente poderá novamente tentar simultaneamente, basta pensar no cenáriode um servidor web, onde milhares de solicitação estão chegando ao servidor web porsegundo.Então, durante esse tempo em que o servidor estiver ocupado em executar esta palavra a chamada de umadurante esse tempo a outra conexão irá obter backlog.  Agora, ao lado do loop, estamos fazendo o aceite chamado no lado do servidor, agora o TCP é um serviço orientado a conexão que é, por que você tem que fazer a chamada connect a partir do lado do cliente e aceitar chamada do lado do servidor para iniciar a conexão,que utilizará o handtremendo de três vias do protocolo TCP. Então, depois que estamosfazendo a chamada aceitar a chamada aceitar, estamos passando o parâmetro como o descritor do arquivo de socket, o endereço do cliente e um comprimento do endereço do cliente se houver um erro.Então, toda essa função se houver um erro, eles retornam algum número negativo. Então, é por isso quevocê pode verificar o valor de retorno se ele for menor que 0; isso significa que certo erro ocorreu.Ok. Então, depois que uma vez que é aceito a conexão, estamos imprimentamos que temosrecebido uma nova conexão do endereço do cliente, estamos especificando o endereço do clientee a porta do cliente. Então, a partir daquele endereço de cliente específico e da porta do cliente uma nova conexãofoi recebida e depois disso estamos tendo um loop, onde estamos recebendoos dados do novo socket que foi criado.Agora, aqui também enquanto você está fazendo a chamada aceita, na chamada aceita, ele retorna novo arquivodescritor e este novo descritor de arquivo iniciará esta conexão final, entreservidor e o cliente. Então, ele retorna um novo descritor de soquete que utilizaremos noenviando ou nos dados de recebimento, que é específico para um tubo ou específico para um soquete entre um severe o cliente correspondente.Agora, se o recebveLen for igual a igual a 0; isso significa, você não está recebendo nenhum dadodo cliente. Assim, você pode fechar esta conexão particular. Caso contrário você obtiver os dadose colocar naquele dado que você está recebendo no lado do servidor e depois disso somos realmentequaisquer que sejam dados que recebemos, estamos exigindo mesmos dados para o cliente usando issomesma função ok. Então, você recebeu os dados, que são armazenados no buffer recebidomesmos dados são decodificados de volta para o lado do cliente.Ok, no lado do cliente, as coisas são bem parecidas em estamos declarando o socket estamoscriando um novo socket e depois de criar o novo socket, estamos obtendo o aqui no lado cliente, estamos recebendo o IP do servidor ou o nome do host do servidor e a porta do argumento de linha de comandos. Por isso, estamos usando esse argumento de linha de comando para criar o endereço do servidor.Então, ele inicializa a conexão com o servidor usando o procedimento TCP three way handtremendo. Agora, após isso após a chamada do sistema connect ter feito, você iniciou a conexãocom o servidor então, faz a chamada para a função enviar, a função enviar paraenviar os dados. Então, estamos criando uma mensagem chamada hello aí esta mensagem em particular,estamos enviando para o servidor e como você viu no código do servidor que o servidor irárealmente vai voltar aquela coisa em particular para o cliente.Então, depois de você estar enviando que está recebendo a mensagem. Então, estamos declarando um buffercomo uma matriz de caracteres, obteremos os dados na forma de uma matriz de caracteres ou uma string. Então, estamos declarando que buffer para isso e depois disso estamos fazendo uma chamada de recebimento, esta chamada de recebimento sobre aquele descritor de arquivo de socket que obterá os dados do lado do cliente.Assim, do lado do servidor, assim como você viu no código do servidor, o servidor irá realmente irvoltar os dados que você está enviando então, aqui você está enviando este olá para lá funcionar,mesmo olá lá a função será repassada. Assim, você receberá esses dados e depois dereceber esses dados você imprimirá esses dados em particular no conceito. Então, esse é o código para o lado do cliente.Agora, deixe-nos compilar e executar essas duas coisas. Então, primeiro vamos compilar o servidor TCP ecompilar cliente TCP. Então, primeiro vamos executar o servidor. Então, precisamos especificar o endereçoda porta. Então, estamos dando endereço de porta como 2444, esse servidor agora vai o servidor érodando lá. Então, uma vez que o servidor está rodando lá do lado do cliente, podemos dar tãoque o servidor está rodando na minha máquina.Então, estou dando o nome do host do servidor como host local e a porta do servidor correspondente que,nós utilizamos aqui 2444. Então, ele recebeu a mensagem e no lado do servidor você podever que, ele recebeu uma nova conexão da máquina local o IP é 127.0.0.1 euma porta de 47676. Então, ele recebeu este olá mensagem, ele tem ele de volta e o clienterecebeu essa mensagem.Então, aqui você verá que esta conexão. Então, aqui estamos fazendo um loop while edentro deste enquanto loop, estamos aceitando a conexão.Então, como toda essa coisa funcionará se a equação do cliente múltiplo estiver vindo simultaneamenteentão, um cliente será tirado que será tirado aquela conexão que será executada.Então o próximo cliente será executado, então o terceiro cliente serátirado, que será executado e dessa forma toda essa coisa vai continuar.  Vou sugerir que você olhe para esse conceito de processo em sistema operacional e olhe para ele em detalhes. Assim, utilizaremos esse conceito de processo no sistema operacional para analisar estaimplementação de servidores simultâneos nos servidores paralelos. Então, como já olhamosmais cedo que você está criando várias tais conexões.Agora, se vários clientes estão tentando se conectar ao servidor simultaneamente, então como vaivocê manejar essa coisa. Por isso, uma maneira de manejar é usando o servidor iterativo, mas como nósvimos que o servidor iterativo pode não ser muito útil. Então, implementamos o servidor paralelousando este conceito de múltiplos processos em sistema operacional.
Programação de Soquete: TCP-Parte 2
Então a ideia é algo assim você tem um processo de servidor, que está tendo o soquete do paientão, você pode fazer uma chamada de sistema fork. Por isso, em sistema operativo, essa chamada de fork systemcria um processo infantil. Então o que você pode fazer que uma vez que você está aceitando uma conexãoentão você pode fazer essa chamada de sistema fork para criar um processo filho, que na verdademanipulará a transmissão de dados e recepção de dados a partir daquela conexão filha específica.Se você não estiver fazendo isso, se você estiver fazendo isso da maneira anterior que estamos fazendo dentroo loop while na forma de servidor iterativo, então o tempo até que um determinado servidor sejamantenha-se em enviar e receber dados, ele não está fechando a conexão até aquele ponto a conexãopermanecerá bloqueada. Então, o servidor não poderá manipular a segunda conexãoaté que a primeira conexão seja completa.Então, é por isso que a ideia é que, sempre que uma nova conexão estiver chegando, você faça uma chamada de sistema forke depois de fazer uma chamada de sistema fork tenha um processo filho, aquele processo filhoque é a parte do processo do servidor, mas que criará um soquete infantil ele irá. Então, nósvimos que depois que você está fazendo uma chamada de aceitação no site do servidor, ele retorna um novo identificador de socket, que é usado para enviar ou receber dados para o cliente.Então, você passa aquele determinado descritor de arquivo de soquete específico para o socket filho, que irámanipular a transmissão de dados e a recepção em paralelo. Então, a ideia ampla aqui é que você obtenhatodas as conexões uma após a outra, mas não espere pelo envio e uma funcionalidade de recebimentode nossas conexões individuais e mantenha outras conexões na fila de espera. Assim, você cria um processo filho e que o processo filho irá ou nós chamamos como um soquete filho, que manipulará o envio e uma recepção funcionalidades de dados do cliente individualsolicite que você esteja obtendo.(Consulte o Tempo do slide: 18:32)Então, essa foi nossa implementação do servidor iterativo que fizemos, temos umenquanto loop, dentro do loop while você está fazendo uma chamada de aceite então, você tem o envioe recebe e ele é ineficiente porque até que você esteja completo que envie e um recebafuncionalidades, você não conseguirá sair dessa e obterá ou fazer a chamada aceitar novamente para aceitar a nova conexão de entrada.Então, se você analisar que o servidor iterativo funciona que a chamada de atendimento ele configura uma sinalização que,o socket está no estado de atendimento e definir o número máximo de conexões de backlogque você viu anteriormente então, a chamada aceita ele bloqueia um soquete de recebimento, até que uma nova conexãovenha na fila de conexão e ela seja aceita. Então, essa chamada de aceite é uma chamada de bloqueio. Então, o sistema vai continuar esperando aqui até que, você está fazendo uma chamada de conexãodo lado do cliente. Por isso, é uma chamada de bloqueio.Agora, uma vez que esta nova conexão é aceita, então o novo descritor de arquivo de socket diz, o fd de conexãoele é escrito, que é usado para ler e gravar dados ou para enviar e receber dadospara o soquete conectivo. Agora toda a outra conexão, que vem nessa duração sãobacklogados na fila de conexão, pois o processo está ocupado dentro deste enquanto loop paraenviar e receber dados.  Agora, estendemos este sever iterativo para um servidor simultâneo. Então, a nossa ideia é que o processamento paralelode cada soquete de entrada, para que a chamada de aceite seja executada com mais frequência.Então, o que fazemos aqui? Aqui você vê que depois que estamos fazendo essa chamada de aceite, que éretornando o novo descritor de arquivo de socket então, nós aceitamos com sucesso uma conexão do clienteentão nós fazemos uma chamada de sistema fork. Então, essa chamada de sistema fork no processo do pai, ele retorna a ideia do processo filho e no processo filho ele retorna 0.Então, sempre que você estiver fazendo essa chamada de sistema fork e se a chamada do sistema fork está retornando0; isso significa, você está dentro do processo infantil. Agora esse processo infantil, o que ele faz? Elefecha o soquete original o socket do servidor e ele usará este novo fd de soquete que você obtevepara enviar e receber dados. Assim, você fecha o antigo soquete já que toda a comunicação seráatravés do novo socket e então você inicializa o buffer, copie a mensagem para ele, envie oufaça o recibo o que você quiser fazer.Agora, o que vai acontecer aqui que o que estiver lá dentro da chamada do sistema fork, dentro deste blocofork neste se bloco que executará get executado em paralelo. Assim, no processo paio processo pai não será assim para o processo pai, este receberá retorno falso,porque pai o fork do processo pai retorna o ID do processo filho e no fork do processo filhoretorna 0.Então, no processo pai você retornará de volta e o processo pai virá novamenteaqui e fazer a próxima chamada de aceite. Então, o processo pai agora não precisa esperar poreste envio e recebimento de funcionalidades, que serão tratadas por um processo infantil.Agora, vamos analisar a demo desta. Por isso, aqui não fazemos nenhuma alteração na implementação do cliente. A implementação do cliente permanece como foi antes, nós apenasfaremos alteração na implementação do servidor. Por isso, na implementação do servidor, portanto, a mudançaque, fizemos o código inteiro é semelhante se você analisar que somosdeclarando este endereço do servidor, seguido por uma chamada de socket então inicializando os endereços emo campo de endereço do servidor, fazendo uma chamada de ligação, fazendo uma chamada de atendimento para transmitir o ou não para orealmente transmitir este pode não ser um termo correto para anunciar a porta onde o sever érealmente atendendo e depois disso fazer o conjunto sock opt como anterior e então dentro deeste enquanto loop, onde você está aceitando aceitar a conexão que estamos aceitando aceitando uma nova conexão e ela está indo para esse fd filho estamos criando um novo descritor de arquivo.Depois disso você vê que estamos fazendo uma chamada de bifurcação. Então, você olha para esta declaração em pararetornar igual a fork. Por isso, estamos fazendo uma chamada de bifurcação que criará um processo infantil, agoraVou sugerir que você olhe para este conceito de sistema operacional em detalhes, não temos escopopara discutir isso, a ideia aqui é que sempre que estiver fazendo uma chamada fork todo esse códigoserá copiado também para o processo infantil. Então, a criança processa o que vai fazer? Emo processo filho, a chamada forca retornará um 0 e no processo pai a chamada forca serádevolverá o ID do processo filho.Então, dentro do processo filho esta parte do código será executada. Agora você vê isso osegundo enquanto loop que nós tínhamos que realmente lida com o envio e recebimento de dados, ele édentro apenas do processo filho. Então, ele está dentro deste se bloco aqui estamos fazendo isso receberchamada e uma chamada de envio.E estamos tendo esse manuseio em paralelo no lado do sever. Então, no lado do servidor esteem particular se bloco não será executado, pois no servidor no lado pai, paisoquete este não será executado, pois o soquete pai retornará o ID da criança. Assim, ele não será igual a 0.Então, esta parte só executará no processo da criança. Assim, o processo filho passa a lidarcom o envio e recebimento dos dados, mas o processo pai pode sair disso, o processo painão está sendo bloqueado nesta segunda enquanto loop, ele pode sair diretamentee aceitar a próxima conexão.Então, possivelmente não teremos uma sensação dessa execução paralela, mas o que está acontecendo lá.Um novo processo filho é criado e ele lida com essa solicitação individual que somosenviando aqui.Agora neste caso específico, o que pode acontecer que não temos nenhum servidor central paracontrolar a entrega de mensagem de chat, todo usuário corre é próprio servidor de chat; isso significa, eleexecuta o servidor TCP para entrada vem conexões e mensagens recebidas, agora emUNIX, ele mantém toda conexão como um descritor de arquivo que já vimos.Agora, nesse momento em um servidor de chat você tem um requisito típico que você precisa tambémler dados da entrada padrão. Então, você precisa digitar alguma coisa. Então, quando você estárecebendo uma mensagem durante esse tempo diga, você está digitando alguma coisa.  Então ok para isso usamos esse conceito na chamada do sistema select, que é novamente uma chamada de sistema de nível de sistema operacional.Então a chamada do sistema select, ele seleciona a partir de múltiplos descritor de arquivos, que é uma maneira simultâneapara tratar de múltiplos descritor de arquivos simultaneamente mesmo a partir de um único processo. Assim, vocêpode obter os dados do socket, que é um do descritor de arquivo assim como o descritor de arquivo do tecladosimultaneamente.Agora, o que vimos que, o que acontece em uma implementação de servidor iterativo que nósfizemos anteriormente que a chamada aceita está bloqueada até que você tenha concluído a leitura eas chamadas de gravação. Agora o que se você fizer várias atividades de leitura e gravação depois de aceitar uma conexão de entrada, que as outras conexões estão bloqueadas e esperando a fila de conexão, elas podem ficar faminadas. Agora selecione é a maneira de quebrar esse bloqueio.Então, uma maneira de quebrar o bloqueio é usando essa implementação paralela outra maneira defazer essa coisa é usar a chamada do sistema select. A vantagem com esta chamada de sistema select éque, você não precisa criar vários processos filhos, agora não é necessário se preocuparsobre os zombies. Então, os processos filhos sempre tem um problema que se você é se algum tempoo processo pai é morto ou o processo pai pára, então o processo filho se tornazumbi. Por isso, com o sistema select call você não precisa se preocupar com esse zumbi. Assim,você pode possivelmente gerenciar recursos de forma mais eficiente
Programação de Soquete: TCP -Parte 3
Então, este sistema de seletas a chama não é nada além de um multiplexador.
Então, o que acontece que você tem vários descritores de arquivos, você tem certos sinais e o tempofora e fora desse múltiplo descritor de arquivo, ele seleciona um dos descritores do arquivo. Então, eledescobre que entre este descritor de arquivo que um está atualmente ativo e ele seleciona-se aqueleespecífico do descritor de arquivo.Então, aqui está o formato da chamada do sistema select, na chamada de sistema select você está fornecendoo número de descritor de arquivo, é o maior número de descritor de arquivo em qualquer um dos três conjuntos demais 1, temos três conjuntos diferentes de descritor de arquivo, o descritor de arquivo de leitura para leralgo como entrada, o descritor de arquivo de gravação para escrever algo na saída eexceto descritor de arquivo para tratar das exceções.Então, este arquivo descritores de arquivo são um tipo de estrutura chamada fd set e temos um valor de tempo limite.Então, o valor do tempo limite é que se você não está recebendo nada deste descritor de arquivo paraeste valor de tempo limite. Assim, ele vai sair das coisas.Então, ele está realmente lhe fornecendo uma multiplexação de E/S síncrona sobre entrada assíncrona.Então, como mencionamos anteriormente que sua entrada pode ser assíncrona, você pode obter uma mensagemsobre o soquete enquanto estiver fazendo a digitação, mas ele fornece uma multiplexaçãopara selecionar ou o teclado ou o soquete a uma só distância.Então, você tem três descritor de arquivo diferente que cada descritor de arquivo será assistido para verse os caracteres ficarem disponíveis para leitura, o descritor de arquivo de gravação será assistido para verse os espaços disponíveis para gravação e o excepcional descritor de arquivo será assistido paracondição excepcional.Agora temos um valor de tempo limite, o intervalo que selecionar deve bloquear a espera de um descritor de arquivose tornar pronto, agora a chamada select permanece bloquear ou o descritor de arquivofica pronto ou a chamada é interrompida por um manipulador de sinal ou um tempo limite expirará. Assim, emqualquer um dos casos ele sai da select. Assim, sempre que um do descritor de arquivose torna pronto ele sai da chamada select, se aquela chamada particular é interrompida por algunsoutros sinais ou o tempo limite acontece. Então, este é o procedimento para configurar o tempo limite vocêfornece o valor em forma de segundo e microssegundos.(Consulte o Tempo do slide: 32:59)Agora, como você passa o descritor de arquivo a selecionar? Então, para isso o que fazemos, nós primeiroinicializamos o conjunto de fd do descritor de arquivo, que é um bitmap de tamanho de correção com este fd 0, então nósfazemos a chamada para fd set. Então, se esse conjunto fd seleciona um descritor de arquivo digamos, meu soquete que eu tenhodefiniu e o correspondente o descritor de arquivo, que onde o socket está ficandoadicionado. Então, este bit específico corresponde a este descritor de arquivo de socket que vai ficar configurado;que significa, alguns dados estão disponíveis lá.(Consulte o Tempo do slide: 33:42)Ok então você faz a chamada select so, como selecionar funciona? Então, ele olha sobre todo o descritor de arquivopara todo descritor de arquivo que ele chama de método de sondagem do descritor de arquivo. Então, esse método da pesquisaé verificar se algo está disponível para ou algum evento está esperando noesse descritor de arquivo. Assim, ele irá adicionar o chamador a essa fila de espera do descritor de arquivo e retornar,quais eventos atualmente se aplicam a esse descritor de arquivo se ele é descritor de arquivo élegível.Se ele é um descritor de arquivo de leitura se ele é gravável, se é um descritor de arquivo de gravação ou alguma exceçãoaconteceu. Agora se qualquer um do descritor de arquivo corresponde à condição de que o usuárioestivesse procurando por leitura, gravação ou exceção, então o select será simplesmente escritoimediatamente, após atualizar o conjunto apropriado do descritor de arquivo que o usuário passou e senão o select irá dormir para o valor do tempo limite uma vez, o tempo limite ocorrerá ele viráfora dessa chamada select.(Consulte o Tempo do slide: 34:43)E se alguns outros eventos acontecerem dentro desse evento de tempo limite, ele fará este conjunto FD esair disso. E durante esse intervalo se acontecer um evento interessante a qualquer um do descritor de arquivoque selecionar está aguardando aquele descritor de arquivo irá notificar sua fila de espera. Então,isso fará com que esse encadeamento dormindo dentro do wakeup select e ele repita o loopacima e veja qual do descritor de arquivo agora está pronto para ser devolvido para o usuário.Agora, o valor de retorno do select we temos três valores se for menos 1 significa que algum erroencontrou. 0 significa que o tempo limite aconteceu e maior que 0 significa, queque o número de soquetes que tem o evento pendente como ler gravação ou exceção. Assim, paraquantas soquetes que o evento está pendente, se você vai ler ou escrever outendo certa exceção.(Consulte o Tempo do slide: 35:23)Então, após selecionar retornos você pode usar a função chamada FD definida para testar, se um descritor de arquivoé uma parte desse conjunto. Assim, você pode verificar se um descritor de arquivo foi configurado ounão se o descritor de arquivo tem sat set; isso significa, você tem algo a ler, se ele é um descritor de arquivo de leituraou você tem algo para escrever se for um descritor de arquivo de gravação.(Consulte o Tempo do slide: 35:55)Então, vamos analisar um código que utiliza esta chamada select. Utilizaremos a implementação do mesmo servidor TCPcom este select.(Consulte o Tempo do slide: 36:18)Então, a parte de base do código é a mesma que antes estamos declarando o endereço do servidor, a chamada de ligação, a chamada de atendimento no lado do servidor a chamada de opt sock opt e depois disso estamosdeclarando o descritor de arquivo. Então, aqui estamos declarando que podemos ter um máximo de16 descritor de arquivo diferente e este fd len retorna, que quantos são quantos tal descritor de arquivoestá configurado atualmente ou atualmente ativo.Então, estamos declarando o conjunto de descritor de arquivo e o descritor de arquivo máximo que éigual ao descritor de arquivo de soquete atual. Agora dentro deste enquanto loop, inicializamos primeiroo descritor de arquivo, estamos aqui só vamos usar o descritor de arquivo de leitura porque somosindo ler dados do socket e estamos configurando através desta chamada fd set, estamosconfigurando o descritor de arquivo de leitura corresponde ao socket que definimos ou o soqueteonde o servidor está realmente escutando.Agora, estamos looping sobre o descritor de arquivo disponível. Então, aqui a ideia é que sempre queestamos conseguindo uma nova conexão, estamos adicionando-a um dentro do descritor de arquivo dentro daqueledescritor de arquivo configurado.(Consulte o Tempo do slide: 37:25)Depois disso estamos fazendo uma chamada selecionada. Então, como vimos anteriormente que lá não estamosdando qualquer valor de tempo limite, porque não estamos dando nenhum valor de tempo limite. Assim, ele vai manterem espera de duração infinita, sempre que algum evento ocorrerá então só ele virápara fora. Então, estamos inicializando com este descritores de arquivo de leitura.Então, sempre que uma nova conexão virá, ele virá para este descritor de arquivo de leituraatravés deste loop e então ele continuará esperando aqui, quando algum evento ocorrerá quefunção antiga será acionada e aquela função antiga retornará, se certo evento serálá nos descritores de arquivos de leitura determinados meios de eventos, se aquele determinado socket estápronto para ler os dados.E depois disso se selecionar retorna; que significa, algum socket está pronto para ler os dados entãovocê confere usando fd set, se aquele particular socket está pronto para ler os dados se essesocket estiver pronto para ler os dados então, você faz uma chamada de aceita, aceita chamada para aceitar queparticular conexão que significa, alguma conexão está esperando você aceita essa conexãoe depois de fazer isso, a maneira como estamos fechando o descritor de arquivo filho e depois adicionamos aquela determinada coisa para aquele arquivo descritor de arquivo.(Consulte o Tempo do slide do arquivo: 38:52) Então neste fd configure você loop sobre todo o descritor de arquivo que foi adicionado.Então, se isso recebeu len é igual a igual a 0; que significa, você não está recebendo nenhum dado.Então, você fecha que file descritor e limpe-o do seu conjunto descritor de arquivos.Então, isso tudo é sobre nossa discussão sobre servidor TCP, eu fui bastante rápido ao descrever as coisascom a suposição de que você tem um conhecimento básico de programação C e operacional, vamos compartilhar todos os códigos com você e vou sugerir que você navegue no códigoe veja os tutoriais que compartilhamos.E se você tiver alguma dúvida ou qualquer coisa se sinta livre para postar as perguntas no fórum. Assim,com esta programação de soquete em particular, você pode desenvolver seus próprios aplicativos você podemesmo implementar o aplicativo de chat server de que estamos falando. Então, eu vou sugerir quevocê olhe para isso e impleta vários aplicativos desse tipo por conta própria com a ajudadessa variância de programação de soquete diferente.Então, obrigado a todos por participarem dessa aula; da próxima aula em diante, iremos paranovamente os aspectos teóricos da pilha de protocolos TCP/IP.Então, obrigado a todos por participarem desta aula.