====== Programação Cliente Servidor em Linux ====== Características para um sistema ser considerado cliente/servidor: - Uma arquitetura cliente/servidor consiste em um processo de cliente e um processo de servidor, que podem ser distinguidos um do outro, embora possam interagir totalmente. - A parte cliente e a parte servidor podem operar em diferentes plataformas de computador. - Tanto a plataforma do cliente como a do servidor podem ser atualizadas sem que se tenha de necessariamente atualizar a outra plataforma. - O servidor pode atender a vaŕios clientes simultaneamente. O cliente pode acessar vários servidores. - Ambos incluem capacidade de operar em rede. - A ação normalmente é iniciada no cliente. A chave para entender o conceito de programação cliente/servidor, é o entendimento do relacionamento lógico entre a entidade que requisita o serviço (isto é, o cliente) para a outra entidade (o servidor), que provê os serviços requisitados. Um cliente pode manter um relacionamento com diferentes servidores, que o atendam. Um servidor pode atender múltiplos clientes. {{:modelos_client_server.pdf |Exemplos de cliente/servidor}} Um atributo do servidor é pode atender vários clientes. Uma forma é criar servidores escravos para atender aos clientes. Neste exemplo, para cada cliente tem-se um servidor dedicado (relação de 1 para 1). {{:servidor_cria_escravo.pdf|Servidor criando escravos para atender o cliente}} ===== Aspectos da Conexão ===== São dois os tipos de conexão utilizados em uma comunicação. Conexão orientada e conexão não orientada. ==== ConnectionLess ==== Na conexão do tipo //connectionless// (não orientado a conexão): * Cada mensagem é independente. * Não existe garantia de entrega (a mensagem procura o servidor). * Mensagens de mesma origem podem chegar ao servidor por caminhos diferentes. * A sequência de envio pode ser diferente da sequência de chegada. Este tipo de comunicação também é chamada de comunicação por datagramas. O serviço postal é um exemplo na vida real para este tipo de comunicação, afinal é possível enviar uma carta sem que alguém a esteja esperado. {{:diagrama_udp_cliente_server.pdf|Relacionamento entre funções para programação UDP}} ==== Connection-Oriented ==== O outro tipo de comunicação é conhecido como //connection-oriented// (orientado a conexão): * O caminho entre as partes é previamente estabelecido e conhecido. * Existe garantia de entrega. * A sequência de envio e recepção é respeita. * A cada envio do cliente, o servidor responde confirmando o recebimento. Este tipo de comunicação é conhecido como //datastream// ou somente conexão //stream//. O serviço de telefonia é um exemplo na vida real para este modelo. Deve haver uma pessoa do outro lado para atender a chamada telefônica. {{:diagrama_tcp_cliente_server.pdf|Relacionamento entre funções para programação TCP}} ===== Funções do Linux ===== A programação para rede utiliza as seguintes funções: * [[socket]] * [[htonl]], [[htonl|htons]], [[htonl|ntohl]], [[htonl|ntohs]] * [[bind]] * [[inet_aton]], [[inet_aton|inet_addr]] e [[inet_aton|inet_ntoa]] * [[connect]] * [[listen]] * [[accept]] * [[send]] * [[recv]] * [[send|sendto]] * [[recv|recvfrom]] * [[close]] * [[shutdown]] * [[getpeername]] * [[gethostbyname]] * [[select]] E utiliza as seguintes estruturas: * [[sockaddr_in]] ===== Exemplos de Aplicação ===== * Cliente e Servidor [[exemplo_tftp|TFTP]] (usando UDP) * Cliente e Servidor de [[exemplo_eco|ECO]] (usando TCP) --- //[[marcos@laureano.eti.br|Marcos Laureano]] 2009/02/14 11:52//