Escolar Documentos
Profissional Documentos
Cultura Documentos
conexo, e estes recursos no sero mais usados. Um servidor projetado para rodar continuamente e se seus clientes carem repetidamente ficar sem recursos (ou seja, sem soquetes, espao em buffer, conexes TCP) e no poder atender a novos pedidos de conexo.
A interface socket permite que uma aplicao conecte um socket UDP a um ponto remoto, mas a conexo com o servidor no efetivamente realizada.
Figura 1: As quatro categorias gerais definidas pelo oferecimento de concorrncia e pelo uso de servio de transporte orientado a conexo.
enviando R pedidos por segundo, deve ter um tempo de processamento menor que 1/KR segundos por pedido. Se o servidor no puder tratar os pedidos a essa taxa, ocorrer o transbordamento na fila de espera. Nesse tipo de situao, o projetista dever considerar a implementao de um servidor concorrente.
bind() no pode especificar um nmero de porta de protocolo sem especificar um endereo IP. Infelizmente, selecionar o endereo IP do servidor onde sero aceitas conexes pode ser difcil. Roteadores e hospedeiros multi-homed podem ter vrios endereos IP. Se o servidor especificar um endereo IP particular, o soquete no aceitar comunicaes de clientes que enviarem pedidos para um outro IP da mquina. Para resolver este problema, a interface socket define uma constante especial, INADDR_ANY, que pode ser usada no lugar de um endereo IP. INADDR_ANY especifica um endereo coringa que pode assumir qualquer um dos endereos IPs do hospedeiro. INADDR_ANY torna possvel a um mesmo servidor aceitar qualquer comunicao endereada a qualquer endereo IP do hospedeiro.
Algoritmo 2
1. Criar um soquete e lig-lo a um endereo conhecido para o servio sendo oferecido. 2. Repetidamente, ler a prxima requisio do cliente, formular uma resposta e envila ao cliente de acordo com o protocolo de aplicao.
Algoritmo 2: Servidor iterativo sem conexo. Uma nica linha de execuo trata pedidos (datagramas) de clientes, um por vez.
O procedimento de criao de um soquete para um servidor iterativo sem conexo o mesmo usado para o servidor orientado a conexo. Neste caso, porm, o soquete do servidor permanece desconectado e pode aceitar datagramas de entrada de qualquer cliente.
onde s um soquete desconectado, message o endereo de um buffer que contm os dados que devem ser enviados, len especifica o nmero de bytes no buffer, flags especifica opes de controle e depurao, toaddr um ponteiro para uma estrutura sockaddr_in que contm o endereo do destinatrio da mensagem e toaddrlen um inteiro que especifica o tamanho da estrutura de endereo. A interface socket fornece uma maneira fcil para que servidores sem conexo obtenham o endereo do cliente. A chamada recvfrom() tem dois argumentos que especificam dois buffers. O sistema coloca o datagrama recebido em um buffer e o endereo do remetente no outro buffer. A chamada recvfrom() tem a seguinte forma:
retcode = recvfrom (s, buf, len, flags, from, fromlen);
onde s especifica um soquete, buf especifica o buffer onde o sistema ir colocar o prximo datagrama, len especifica o espao disponvel (bytes) no buffer, flags controla casos especiais (p.ex. verificar se chegou um datagrama sem retir-lo do soquete), from especifica o segundo buffer onde o sistema colocar o endereo da fonte, fromlen especifica o endereo de um inteiro. Inicialmente, o inteiro para onde fromlen aponta especifica o tamanho do buffer from. Quando a chamada retorna, fromlen conter o tamanho do endereo da fonte que o sistema colocar no buffer from. Para gerar uma resposta o servidor usa o endereo que recvfrom() armazena no buffer from quando o pedido chega.
conexo deve-se considerar cuidadosamente se o custo da concorrncia no maior que o ganho em velocidade. De fato, como criar um processo ou thread dispendioso, poucos servidores sem conexo tm implementaes concorrentes. Algoritmo 3
Mestra 1. Mestra 2. Criar um soquete e lig-lo ao endereo conhecido para o servio que est sendo oferecido. Deixar o soquete desconectado. Repetir: chamar recvfrom() para receber o prximo pedido de um cliente e criar uma nova escrava (possivelmente em um novo processo) para manipular a resposta. Comea com uma requisio especfica passada pela Mestra assim como com acesso ao soquete. Formar uma resposta de acordo com o protocolo de aplicao e envi-la ao cliente usando sendto(). Sair (ou seja, a escrava termina aps tratar um pedido).
Algoritmo 3 : Servidor Concorrente e sem conexo. A servidora mestra aceita pedidos de entrada (datagramas) e cria escravas (processos/threads) para manipular cada um deles.
Algoritmo 4: Servidor concorrente orientado a conexo. A linha de execuo mestra aceita uma conexo, cria uma escrava para trat-la. Uma vez que a escrava tenha terminado, ela fecha a conexo.
Como no caso sem conexo, a linha servidora mestra nunca se comunica com o cliente diretamente. Enquanto a escrava interage com o cliente, a mestra espera por outras conexes.
10
descreve um servidor com uma nica linha de execuo que manipula vrias conexes concorrentemente.
Algoritmo 5
1. Criar um soquete e lig-lo porta bem-conhecida para o servio. Adicionar o soquete a uma lista de soquetes atravs dos quais a E/S possvel. 2. Usar select() para esperar por E/S nos soquetes existentes. 3. Se o soquete original estiver pronto, usar accept() para obter a prxima conexo e adicionar o novo socket lista de soquetes onde E/S possvel. 4. Se algum soquete diferente do original estiver pronto, usar recv() ou read() para obter o prximo pedido, formar a resposta e usar send() ou write() para enviar a resposta de volta ao cliente. 5. Continuar no passo 2 acima.
Algoritmo 5: Servidor concorrente orientado a conexo implementado por uma nica thread. A thread espera pelo prximo descritor que estiver pronto, o que pode significar ser a chegada de uma nova conexo que um cliente enviou uma mensagem atravs, de uma conexo j existente.
O termo impasse, ou deadlock, refere-se a uma condio na qual um programa ou conjunto de programas no pode prosseguir porque esto bloqueados esperando por um evento que nunca acontecer. No caso tratado, a ocorrncia de um impasse leva a que servidor pare de responder a pedidos.
11
concorrentes, ficar bloqueado apenas a thread escrava associada ao cliente que no envia requisies ou no recebe as respostas. Entretanto, em implementaes que usam uma nica thread, o servidor central ficar bloqueado, no podendo tratar outras conexes. A questo importante aqui que qualquer servidor que use apenas uma thread estar sujeito ocorrncia de impasses.
3.25 Resumo
Foram apresentados algoritmos e discutidos alguns aspectos importantes a considerar quando do projeto de software servidor.
Bibliografia
COMER, D. E., STEVENS, D. L., Internetworking With TCP/IP Volume III: Client-Server Programming and Applications, Linux/POSIX Socket Version, Prentice-Hall International 2001, Captulo 8. STEVENS,W.R.; "UNIX NETWORK PROGRAMMING - Networking APIs: Sockets and XTI" Volume 1 - Second Edition - Prentice Hall - 1998 Obs. Resumo preparado por Magda Patrcia Caldeira Arantes e revisado por Juan Manuel Adn Coello.
12