Interações cliente/servidor usando o UDP

Slides:



Advertisements
Apresentações semelhantes
TRATAMENTO DE ARQUIVOS EM C
Advertisements

Sistemas Operacionais II N Aula prática Java Sockets, RPC e RMI Eduardo Bezerra.
E/S Síncrona x E/S Assíncrona no sistema Unix
Sockets Marco Antonio – marcoreis.net Arquiteto de Software Dezembro/2007.
Comunicação entre processos distribuídos
Programação II Estruturas de Dados
Programação II Estruturas de Dados
MPI – Comunicações Com. Colectiva esquecida Barrier não há troca de dados, apenas sincroniza os processos int MPI_Barrier( MPI_Comm, comm) T com = T lat.
Ir p/ primeira página Cliente/Servidor Modelo usado para construir aplicações Servidor em número de porta conhecido – Aceita requisições e executa serviços.
Profa. Ana Cristina Benso da Silva Redes de Computadores
TADS – Tipos Abstratos de Dados
Programação com sockets API Sockets apareceu no BSD4.1 UNIX em 1981 são explicitamente criados, usados e liberados por aplicações paradigma cliente/servidor.
O conceito de socket Uma comunicação entre dois processos via TCP (ou UDP) é identificada unívocamente por dois pares de valores, que denotam os dois pontos.
David Menotti Algoritmos e Estruturas de Dados I DECOM – UFOP
Conceitos de Sockets Universidade Federal do Rio Grande do Sul (UFRGS)
LPG - I: Alocação Dinâmica de Memória - Ponteiros
Comunicação Inter-Processos
LPG-I: Tipos Complexos - Estruturas
Listas com Ponteiros Listas encadeadas Listas circulares.
1 Introdução aos Sockets (Java) Tiago Semprebom DAS – Departamento de Automação e Sistemas UFSC – Universidade Federal de Santa Catarina.
Curso de C/C++ Avançado
Armazenamento de Dados em Arquivos
Slides Prof. Jean SIMÃO Revisão: Prof. João FABRO
Slides: Prof. João Fabro UTFPR - Curitiba
Armazenamento de Dados em Arquivos
Slides: Prof. SIMÃO Revisão: Prof. João Fabro
Fundamentos de Programação 1
Tratamento de Ficheiros
FEUPDEECRedes de Computadores, 4º Ano de EEC, ramo de ACI Sockets Abril, 98Isidro Vila Verde 1 Formato das estruturas de dados Estrutura.
Prof. Edmundo R. M. Madeira Carlos R. Senna MC823 Laboratório de Teleprocessamento e Redes Primeiro Semestre 2007.
Revisão /*======================================================*/
Infra-Estrutura de Comunicação (IF678) Aula Prática 02 – CIn/UFPE Davi Duarte Denyson José Eduardo Souza Ivan França Rafael Lima.
INPE / CAP-315 Airam J. Preto, Celso L. Mendes Aula 27 (1) Programação com MPI Tópicos: Modelo de Programação Funções de Ambiente Funções Básicas.
TAD Pilha com Alocação Dinâmica de Memória
Comunicação entre processos usando Sockets
Estrutura de dados II Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
Estrutura de dados II Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
Programação de Sistemas de Comunicação
Comunicação Entre Processos Sockets - Java
Educação Profissional Técnica de Nível Médio Curso Técnico de Informática Disciplina: Estrutura de Dados Professor: Cheli dos S. Mendes da Costa Arquivo.
Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
Comunicação entre processos: Mensagens Nazareno Andrade Universidade Federal de Campina Grande 02/2008 Sistemas Distribuídos.
Comunicação entre Processos - Sockets. Conceitos Básicos Sockets são uma forma de IPC ( InterProcess Communication ) fornecida pela 4.3 BSD que fornecem.
Estruturas de Dados Aula 2: Estruturas Estáticas 07/04/2014.
Educação Profissional Técnica de Nível Médio Curso Técnico de Informática
Programando sockets em python
Implementando comunicação em JAVA via Sockets Alcides Calsavara - Leonardo R. Nunes -
Uso de parâmetros na linha de comando. Parâmetros da função main:
Programação distribuída e concorrente
1 Comunicação Inter-Processos -> RMI -> RPC -> TCP -> UDP (Abstração de passagem de mensagem)
Estruturas de Dados Aula 6: Cadeias de Caracteres
Estruturas de Dados Aulas 3 e 4: Uso da memória e Vetores
Desenvolvimento de Aplicações TCP/IP com Sockets Márcio de Sousa Dias
Programação de Computadores I – Arquivos
Redes de Computadores I Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo -
Arquitetura de Redes de Computadores – Luiz Paulo Maia Camada de Transporte1 Arquitetura de Redes de Computadores Luiz Paulo Maia Camada de Transporte.
Introdução à Programação com Sockets Fernando Jorge Silveira Filho Daniel Sadoc Menasché
Camada de Aplicação Prof. Horácio. Objetivo Apresentar os detalhes específicos dos tipos de aplicação; Apresentar o modelo cliente-servidor; Apresentar.
Estrutura de Dados Revisão Professor Luiz José Hoffmann Filho
Sockets Redes de Comunicação de Dados Prof. Esp. Cristiano José Cecanho.
2: Application Layer 1 Capítulo 2: Camada de Aplicação  2.1 Princípios da camada de aplicação  2.2 Web e HTTP  2.3 FTP  2.4  SMTP, POP3, IMAP.
Fundamentos de Programação 1 Slides 19 Prof. SIMÃO Jean Marcelo SIMÃO Linguagem C “Arquivos Binários”.
Fundamentos de Programação 1 Slides 11 Prof. SIMÃO Jean Marcelo SIMÃO Linguagem C “ Struct, Union, Enum, Typedef ”
Fundamentos de Programação 1 Slides 21 Prof.ª Fabiany e Prof. SIMÃO Linguagem C “Lista Encadeada”.
Fundamentos de Programação 1 Slides 22 Prof.ª Fabiany e Prof. SIMÃO Linguagem C “Lista Duplamente Encadeada - Projeto com vários Arquivos”.
Curso Superior em Redes de Computadores Camada de Aplicação Prof. Sales Filho.
Fundamentos de Programação 1 Slides 18 Prof. SIMÃO Jean Marcelo SIMÃO Linguagem C “Arquivos Seqüências ou de Texto ”. 1.
Soquetes (1) SOCKET Uma interface local, criada por aplicações, ponto final de comunicação no qual os processos de aplicação podem tanto enviar quanto.
Fundamentos de Programação 1
Transcrição da apresentação:

Interações cliente/servidor usando o UDP Servidor (US.C) Cliente (UC.C) mensagem socket_servidor = socket() bind na porta = 9000 Endereço do Servidor socket_client = socket() mensagem send(socket_cliente, mensagem) recv(socket_servidor, mensagem) mensagem mensagem send(socket_servidor, mensagem) recv(socket_cliente, mensagem) close(socket_cliente)

Servidor UDP (US.C) – 1 de 3 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <arpa/inet.h> #include <unistd.h> #define TAM_MSG_MAX 255 /* Mensagem de maior tamanho */ int main(void) {/* Variáveis */ char mensagem[TAM_MSG_MAX]; /* Espaço para a recepção da mensagem do cliente*/ int tam_mensagem_recebida; /* Tamanho da mensagem recebida */ int socket_servidor; /* Socket do servidor */ struct sockaddr_in endereco_servidor; /* Endereço Local */ struct sockaddr_in endereco_cliente; /* Endereço do Cliente */ unsigned short porta_servidor; /* Porta do servidor */ unsigned int tam_endereco_cliente; /* Tamanho da estrutura do endereço do cliente */

Servidor UDP (US.C) – 2 de 3 porta_servidor = 9000; /* Porta local */ /* Criação do socket datagrama/UDP para recepção e envio de pacotes */ if ((socket_servidor = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) { printf("socket() falhou"); return; } /* Construção da estrutura de endereço local */ /* Limpar a estrutura */ memset(&endereco_servidor, 0, sizeof(endereco_servidor)); /* Família de endereçamento da Internet */ endereco_servidor.sin_family = AF_INET; /* Qualquer interface de entrada */ endereco_servidor.sin_addr.s_addr = htonl(INADDR_ANY); /* Porta local */ endereco_servidor.sin_port = htons(porta_servidor); /* Instanciar o endereco local */ if (bind(socket_servidor, (struct sockaddr *) &endereco_servidor, sizeof(endereco_servidor)) < 0) printf("bind() falhou");

Servidor UDP (US.C) – 3 de 3 { for (;;) /* Loop eterno */ { /* Define o tamanho do endereço de recepção e envio */ tam_endereco_cliente = sizeof(endereco_cliente); /* Limpar a mensagem para receber uma nova */ memset((void *) mensagem,(int) NULL,TAM_MSG_MAX); /* Espera pela recepção de alguma mensagem de algum cliente */ if ((tam_mensagem_recebida = recvfrom(socket_servidor, mensagem, TAM_MSG_MAX, 0, (struct sockaddr *) &endereco_cliente, &tam_endereco_cliente)) < 0) printf("recvfrom() falhou"); return; } printf("\nUDP SERVER: Recebi o texto (%s)\n",mensagem); /* Devolve o conteúdo do datagrama para o cliente */ if (sendto(socket_servidor,mensagem,tam_mensagem_recebida,0, (struct sockaddr *)&endereco_cliente,sizeof(endereco_cliente))!=tam_mensagem_recebida) printf("sendto() enviou um numero de bytes diferente do esperado"); printf("\nUDP SERVER: Enviei o texto (%s)\n",mensagem);fflush(stdout); /* não passa por aqui */

Cliente UDP (UC.C) – 1 de 3 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <arpa/inet.h> #include <unistd.h> #define TAM_MSG_MAX 255 /* Mensagem de maior tamanho */ void main(int argc, char *argv[]) { char mensagem[TAM_MSG_MAX]; /* Mensagem a ser enviada e recebida do servidor */ int tam_mensagem; /* Tamanho da mensagem */ int socket_cliente; /* Socket do cliente */ struct sockaddr_in endereco_servidor; /* Endereço do servidor */ unsigned short porta_servidor; /* Porta do servidor */ unsigned int tam_endereco_servidor; /* Tamanho do endereço de envio e recepção (recvfrom()) */ char IP_do_servidor[TAM_MSG_MAX]; /* Endereço IP do servidor */

Cliente UDP (UC.C) – 2 de 3 /* Parâmetros - INICIO */ if ((argc < 2) || (argc > 3)) /* Testa se o número de parâmetros está correto */ { printf("Uso: ./uc <IP Servidor> <Palavra de Echo>\n"); return; } porta_servidor = 9000; /* Porta do Servidor UDP */ memset((void *) IP_do_servidor,(int) NULL,TAM_MSG_MAX); /* Limpa o IP do Servidor */ strcpy(IP_do_servidor,argv[1]); /* Copia o IP do Servidor */ memset((void *) mensagem,(int) NULL,TAM_MSG_MAX); /* Limpa a mensagem a ser enviada para o servidor */ strcpy(mensagem,argv[2]); /* Mensagem a ser enviada para o servidor */ /* Parâmetros - FINAL */ /* Criação do socket datagrama/UDP */ if ((socket_cliente = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) printf("socket() falhou"); /* Construção da estrutura de endereço do servidor */ memset(&endereco_servidor, 0, sizeof(endereco_servidor)); /* Limpar a estrutura */ endereco_servidor.sin_family = AF_INET; /* Família de endereçamento da Internet */ endereco_servidor.sin_addr.s_addr = inet_addr(IP_do_servidor);/* Endereço IP do Servidor */ endereco_servidor.sin_port = htons(porta_servidor); /* Porta do Servidor */

Cliente UDP (UC.C) – 3 de 3 /* Salva o tamanho da mensagem a ser enviada */ tam_mensagem = strlen(mensagem); /* Envio da mensagem para o servidor */ if (sendto(socket_cliente, mensagem, tam_mensagem, 0, (struct sockaddr *) &endereco_servidor, sizeof(endereco_servidor)) != tam_mensagem) { printf("sendto() falhou"); return; } printf("\nUDP CLIENT: Enviei o texto !!! (%s)\n",mensagem); /* limpa a mensagem */ memset((void *) mensagem,(int) NULL,TAM_MSG_MAX); /* Limpar a estrutura */ memset(&endereco_servidor, 0, sizeof(endereco_servidor)); tam_endereco_servidor = sizeof(endereco_servidor); /* Reberendo a resposta do servidor */ if ((recvfrom(socket_cliente, mensagem, TAM_MSG_MAX, 0, (struct sockaddr *) &endereco_servidor, &tam_endereco_servidor)) != tam_mensagem) printf("recvfrom() falhou"); printf("\nUDP CLIENT: Recebi o texto !!! (%s)\n",mensagem); /* Fechar socket do cliente */ close(socket_cliente);

Interações cliente/servidor usando o TCP Servidor (TS.C) Cliente (TC.C) mensagem socket_servidor = socket() bind na porta = 8000 listen(socket_servidor, CONEXOES_EM_ESPERA) Endereço do Servidor socket_client = socket() Conexão TCP connect(socket_cliente, endereco_servidor) socket_cliente = accept(socket_servidor) mensagem send(socket_cliente, mensagem) recv(socket_cliente, mensagem) mensagem send(socket_cliente, mensagem) mensagem recv(socket_cliente, mensagem) close(socket_cliente) close(socket_cliente)

Servidor TCP (TS.C) – 1 de 3 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <arpa/inet.h> #include <unistd.h> #define CONEXOES_EM_ESPERA 5 /* Número máximo de requisições para conexão pendentes */ #define TAM_MSG_MAX 255 /* Mensagem de maior tamanho */ int main(void) { /* Variáveis */ char mensagem[TAM_MSG_MAX]; /* Espaço para a recepção da mensagem do cliente */ int tam_mensagem_recebida; /* Tamanho da mensagem recebida */ int socket_servidor; /* Socket do servidor */ int socket_cliente; /* Socket do cliente */ struct sockaddr_in endereco_servidor; /* Endereço Local */ struct sockaddr_in endereco_cliente; /* Endereço do Cliente */ unsigned short porta_servidor; /* Porta do servidor */ unsigned int tam_endereco_cliente; /* Tamanho da estrutura do endereço do cliente */ porta_servidor = 8000; /* Porta local */

Servidor TCP (TS.C) – 2 de 3 /* Criação do socket para as conexões dos clientes */ if ((socket_servidor = socket(PF_INET, SOCK_STREAM, 0)) < 0) { printf("socket() falhou"); return; } /* Construção da estrutura de endereço local */ memset(&endereco_servidor, 0, sizeof(endereco_servidor)); /* Limpar a estrutura */ endereco_servidor.sin_family = AF_INET; /* Família de endereçamento da Internet */ endereco_servidor.sin_addr.s_addr = htonl(INADDR_ANY); /* Qualquer interface de entrada */ endereco_servidor.sin_port = htons(porta_servidor); /* Porta local */ /* Instanciar o endereco local */ if (bind(socket_servidor,(struct sockaddr*)&endereco_servidor,sizeof(endereco_servidor))<0) printf("bind() falhou"); /* Indica que o socket escutará as conexões */ if (listen(socket_servidor, CONEXOES_EM_ESPERA) < 0) printf("listen() falhou");

Servidor TCP (TS.C) – 3 de 3 for (;;) /* Loop eterno */ { /* Define o tamanho do endereço de recepção e envio */ tam_endereco_cliente = sizeof(endereco_cliente); /* Aguarda pela conexão de um cliente */ if ((socket_cliente = accept(socket_servidor, (struct sockaddr *) &endereco_cliente, &tam_endereco_cliente)) < 0) { printf("accept() falhou"); return; } /* Limpar a mensagem para receber uma nova */ memset((void *) mensagem,(int) NULL,TAM_MSG_MAX); /* Recebe a mensagem do cliente */ if ((tam_mensagem_recebida = recv(socket_cliente, mensagem, TAM_MSG_MAX, 0)) < 0) printf("recv() falhou"); printf("\nTCP SERVER: Recebi o texto (%s)\n",mensagem); /* Devolve a mensagem recebida para o cliente */ if (send(socket_cliente, mensagem, tam_mensagem_recebida, 0) != tam_mensagem_recebida) printf("send() falhou"); printf("\nTCP SERVER: Enviei o texto (%s)\n",mensagem); close(socket_cliente); /* Fecha o socket do cliente */ /*não passa por aqui */

Cliente TCP(TC.C) – 1 de 3 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <arpa/inet.h> #include <unistd.h> #define TAM_MSG_MAX 255 /* Mensagem de maior tamanho */ int main(int argc, char *argv[]) { char mensagem[TAM_MSG_MAX]; /* Mensagem a ser enviada e recebida do servidor */ int tam_mensagem; /* Tamanho da mensagem */ int socket_cliente; /* Socket do cliente */ struct sockaddr_in endereco_servidor; /* Endereço do servidor */ unsigned short porta_servidor; /* Porta do servidor */ char IP_do_servidor[TAM_MSG_MAX]; /* Endereço IP do servidor */ /* Parâmetros - INICIO */ if ((argc < 2) || (argc > 3)) /* Testa se o número de parâmetros está correta */ printf("Uso: ./tc <IP Servidor> <Palavra>\n"); return; }

Cliente TCP(TC.C) – 2 de 3 porta_servidor = 8000; /* Porta do Servidor TCP */ /* Limpa o IP do Servidor */ memset((void *) IP_do_servidor,(int) NULL,TAM_MSG_MAX); strcpy(IP_do_servidor,argv[1]); /* Copia o IP do Servidor */ /* Limpa a mensagem a ser enviada para o servidor */ memset((void *) mensagem,(int) NULL,TAM_MSG_MAX); strcpy(mensagem,argv[2]); /* Mensagem a ser enviada para o servidor */ /* Parâmetros - FINAL */ /* Criação do socket usando o TCP */ if ((socket_cliente = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { printf("socket() falhou"); return; } /* Construção da estrutura de endereço do servidor */ /* Limpar a estrutura */ memset(&endereco_servidor, 0, sizeof(endereco_servidor); endereco_servidor.sin_family = AF_INET; /* Família de protocolos da Internet */ endereco_servidor.sin_addr.s_addr = inet_addr(IP_do_servidor); /* Endereço IP do Servidor */ endereco_servidor.sin_port = htons(porta_servidor); /* Porta do Servidor */

Cliente TCP(TC.C) – 3 de 3 /* Estabelecimento da conexão com o servidor */ if (connect(socket_cliente,(struct sockaddr *)&endereco_servidor, sizeof(endereco_servidor))<0) { printf("connect() falhou"); return; } /* Salva o tamanho da mensagem a ser enviada */ tam_mensagem = strlen(mensagem); /* Determina o tamanho do string de entrada */ /* Envio da string para o servidor */ if (send(socket_cliente, mensagem, tam_mensagem, 0) != tam_mensagem) printf("send() falhou"); printf("\nTCP CLIENT: Enviei o texto !!! (%s)\n",mensagem); /* limpa a mensagem */ memset((void *) mensagem,(int) NULL,TAM_MSG_MAX); /* Reberendo como resposta a mesma mensagem vinda do servidor */ if ((tam_mensagem = recv(socket_cliente, mensagem, TAM_MSG_MAX, 0)) <= 0) printf("recv() falhou"); printf("\nTCP CLIENT: Recebi o texto !!! (%s)\n",mensagem); /* Fechar socket do cliente */ close(socket_cliente);

Exercícios: Marque o número nos fontes dos programas, onde: 1-o servidor TCP estabelece a conexão com o cliente. 2-o cliente TCP estabelece a conexão com o servidor. 3-o servidor TCP define quantas conexões podem ficar em espera. 4-o servidor TCP liga a porta definida ao socket criado. 5-o servidor UDP devolve a mensagem recebida para o cliente. 6-o cliente UDP envia a mensagem para o servidor. 7-o servidor UDP liga a porta definida ao socket criado. 8-é criado o socket que atenderá ao cliente (recebendo a mensagem de devolvendo) no servidor TCP.