Trabalho 02: Cliente e Servidor em C
|
|
|
- Cláudia Sá Rocha
- 8 Há anos
- Visualizações:
Transcrição
1 Trabalho 02: Cliente e Servidor em C Redes de Computadores 1 Descrição Este trabalho deve ser entregue no Moodle até a data correspondente de entrega. Envie sua resposta somente em texto a não ser que outro formato seja absolutamente necessário. Sinta-se encorajado para trabalhar em grupo nesta atividade (contudo, sua entrega é individual). Sua atividade é responder as perguntas em negrito. 2 Cliente Execute o Cliente HTTP C [1]. Escolha três páginas web e execute o programa para estas páginas. Servidores Web geralmente usam a porta 80 para conexão. Listing 1: Cliente Simples de HTTP em Python. /* hw2-simple-client.c: program to connect to web server. */ /* compile with: gcc -Wall -o hw2-simple-client hw2-simple-client.c */ #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <arpa/inet.h> #include <netdb.h> /* maximum size of a printed address -- if not defined, we define it here */ #ifndef INET6_ADDRSTRLEN #define INET6_ADDRSTRLEN 46 #endif /* INET6_ADDRSTRLEN */ #define BUFSIZE 1000 /* print a system error and exit the program */ static void error (char * s) perror (s); exit (1); static void usage (char * program) printf ("usage: %s hostname [port]\n", program); exit (1); 1
2 static char * build_request (char * hostname) char header1 [] = "GET / HTTP/1.1\r\nHost: "; char header2 [] = "\r\n\r\n"; /* add 1 to the total length, so we have room for the null character -- * the null character is never sent, but is needed to make this a C string */ int tlen = strlen (header1) + strlen (hostname) + strlen (header2) + 1; char * result = malloc (tlen); if (result == NULL) return NULL; snprintf (result, tlen, "%s%s%s", header1, hostname, header2); return result; /* must be executed inline, so must be defined as a macro */ #define next_loop(a, s) if (s >= 0) close (s); a = a->ai_next; continue; int main (int argc, char ** argv) int sockfd; struct addrinfo * addrs; struct addrinfo hints; char * port = "80"; /* default is to connect to the http port, port 80 */ if ((argc!= 2) && (argc!= 3)) usage (argv [0]); char * hostname = argv [1]; if (argc == 3) port = argv [2]; bzero (&hints, sizeof (hints)); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; if (getaddrinfo (hostname, port, &hints, &addrs)!= 0) error ("getaddrinfo"); struct addrinfo * original_addrs = addrs; while (addrs!= NULL) char buf [BUFSIZE]; char prt [INET6_ADDRSTRLEN] = "unable to print"; int af = addrs->ai_family; struct sockaddr_in * sinp = (struct sockaddr_in *) addrs->ai_addr; struct sockaddr_in6 * sin6p = (struct sockaddr_in6 *) addrs->ai_addr; if (af == AF_INET) inet_ntop (af, &(sinp->sin_addr), prt, sizeof (prt)); else if (af == AF_INET6) inet_ntop (af, &(sin6p->sin6_addr), prt, sizeof (prt)); else printf ("unable to print address of family %d\n", af); next_loop (addrs, -1); 2
3 if ((sockfd = socket (af, addrs->ai_socktype, addrs->ai_protocol)) < 0) perror ("socket"); next_loop (addrs, -1); printf ("trying to connect to address %s, port %s\n", prt, port); if (connect (sockfd, addrs->ai_addr, addrs->ai_addrlen)!= 0) perror ("connect"); printf ("connected to %s\n", prt); char * request = build_request (hostname); if (request == NULL) printf ("memory allocation (malloc) failed\n"); if (send (sockfd, request, strlen (request), 0)!= strlen (request)) perror ("send"); free (request); /* return the malloc d memory */ /* sometimes causes problems, and not needed shutdown (sockfd, SHUT_WR); */ int count = 0; while (1) /* use BUFSIZE - 1 to leave room for a null character */ int rcvd = recv (sockfd, buf, BUFSIZE - 1, 0); count++; if (rcvd <= 0) break; buf [rcvd] = \0 ; printf ("%s", buf); printf ("data was received in %d recv calls\n", count); freeaddrinfo (original_addrs); return 0; 1. Anote as URLs das páginas que você escolheu e o número de requisições de chamada para obter a página principal de cada página web. Se você executar este exercício corretamente, deverá ver um cabeçalho de resposta HTTP enviado pelo servidor, assim como o seu conteúdo. Você precisará dessa informação para a Parte 5. Algumas páginas enviam devolta uma grande quantidade de dados, você precisará rolar a barra para trás ou procurar uma página web que envie menos dados. 3
4 3 Modificando o Cliente Modifique o cliente da parte 2 para que ele possa requisitar uma URL arbitrária. Você precisará usar operações de string em C para inserir parte do caminho (path) da URL no restante da requisição. Para analisar a URL você poderá usar funções como index, rindex, strstr, e outras similares. Recomendo fortemente o uso de strncat e strncpy ao invés de strcat ou strcpy. Como alternativa, sinta-se livre para usar o snprintf como pode ser visto no código. Você precisará escrever algum código que separe a URL de coisas como: em seus componentes: o endereço do host é prof.facom.ufms.br e o caminho requisitado é /~brivaldo/pages/project/. 2. Modifique e envie seu código. Se seu código funcionar, coloque no seu relatório a quantidade de requisições necessárias para obter: 4 Servidor Execute o servidor HTTP simples 2 na sua máquina local e conecte nele usando vários clientes web, incluindo seu próprio código anteior e pelo menos um navegador de Internet normal. Se você estiver executando seu servidor na porta X (por exemplo, na porta 6789), você pode usar a URL para conectar no servidor usando a mesma máquina. Agora modifique o servidor para imprimir cada requisição, assim você será capaz de ver que requisições seus clientes estão enviando. Lembre-se que os dados que você recebe da rede NÃO são finalizados em nulo, ou seja, NÃO é uma string em C. Para torná-la uma string em C, você deve adicionar o caractere nulo \0 depois de todos os caracteres de dados (isso já pode estár no código, somente faça essa modificação se necessário). 3. Informe o nome do cliente web que você usou para conectar no seu servidor web (Safari, Edge, Firefox, etc.) e determine todas as requisições que o navegador fez ao servidor. Pode ser apenas uma requisição ou podem ser várias. Apenas observe cuidadosamente e informe quais foram as requisições. Listing 2: Servidor HTTP Simples em C. /* hw2-simple-server.c: program to send a constant HTTP 404/501 response. */ /* compile with: gcc -Wall -o hw2-simple-server hw2-simple-server.c */ #include <stdio.h> #include <stdlib.h> #include <unistd.h> 4
5 #include <string.h> #include <time.h> #include <arpa/inet.h> /* maximum size of a printed address -- if not defined, we define it here */ #ifndef INET6_ADDRSTRLEN #define INET6_ADDRSTRLEN 46 #endif /* INET6_ADDRSTRLEN */ #define BUFSIZE 1000 /* print a system error and exit the program */ static void error (char * s) perror (s); exit (1); /* terminates the buffer with a null character and: */ /* returns 0 if the first line has not yet been read */ /* returns -1 if the first line fills (overflows) the buffer */ /* returns 1 if the first line has been read and starts with GET */ /* returns 2 if the first line has been read and starts with something else */ static int parse_request (char * buf, int len, int maxlen) if (len >= maxlen) /* overflow */ return -1; buf [len] = \0 ; /* terminate, i.e. make it into a C string */ if (index (buf, \n ) == NULL) /* not finished reading the first line */ return 0; if (strncmp (buf, "GET", 3) == 0) return 1; return 2; /* must be executed inline, so must be defined as a macro */ #define next_loop(s) if (s >= 0) close (s); continue; int main (int argc, char ** argv) int port = 8080; /* can be used without root privileges */ int server_socket = socket (AF_INET, SOCK_STREAM, 0); if (server_socket < 0) error ("socket"); struct sockaddr_in sin; sin.sin_family = AF_INET; sin.sin_port = htons (port); sin.sin_addr.s_addr = INADDR_ANY; struct sockaddr * sap = (struct sockaddr *) (&sin); printf ("starting HTTP server on port %d\n", port); if (bind (server_socket, sap, sizeof (sin))!= 0) error ("bind"); 5
6 listen (server_socket, 10); while (1) /* infinite server loop */ struct sockaddr_storage from; struct sockaddr_in * from_sinp = (struct sockaddr_in *) (&from); struct sockaddr * from_sap = (struct sockaddr *) (&from); socklen_t addrlen = sizeof (from); int sockfd = accept (server_socket, from_sap, &addrlen); if (sockfd < 0) error ("accept"); if (from_sap->sa_family!= AF_INET) printf ("accepted connection in address family %d, only %d supported\n", from_sap->sa_family, AF_INET); next_loop (sockfd); char prt [INET6_ADDRSTRLEN] = "unable to print"; inet_ntop (AF_INET, &(from_sinp->sin_addr), prt, sizeof (prt)); printf ("accepted a connection from %s\n", prt); char buf [BUFSIZE]; int received = 0; while (parse_request (buf, received, sizeof (buf)) == 0) int r = recv (sockfd, buf + received, sizeof (buf) - received, 0); if (r <= 0) printf ("received %d\n", r); next_loop (sockfd); received += r; int parse = parse_request (buf, received, sizeof (buf)); if (parse == -1) /* first line longer than buffer */ printf ("error: first line longer than %ld\n", sizeof (buf)); next_loop (sockfd); char * code = "HTTP/ Not Found\r\n"; if (parse == 2) code = "HTTP/ Not implemented\r\n"; send (sockfd, code, strlen (code), 0); char date_buf [BUFSIZE]; time_t now = time (NULL); char * time_str = asctime (gmtime (&now)); snprintf (date_buf, sizeof (date_buf), "Date: %s\n", time_str); /* time_str ends with \n. We replace it with \r to give \r\n */ * (index (date_buf, \n )) = \r ; send (sockfd, date_buf, strlen (date_buf), 0); char server_id [] = "Server: dummy HTTP server\r\n"; send (sockfd, server_id, strlen (server_id), 0); send (sockfd, "\r\n", 2, 0); shutdown (sockfd, SHUT_WR); /* not useful, since we close right away */ close (sockfd); 6
7 return 0; 5 Modificando o Servidor Modifique o servidor para retornar o conteúdo de um único arquivo chamado index.html. Você deve criar manualmente este arquivo para testar em conjunto com o seu servidor. Veja um exemplo de um código HTML se você nunca viu um antes: <html> <head><title>web Page do Meu Servidor Web</title></head> <body>esta é uma página Web.</body> </html> O cabeçalho que o seu servidor retorna deve conter pelo menos algum dos cabeçalhos que vimos na Parte 2, especificamente: Connection: close, Server: X (sendo X o nome que você escolheu para o servidor), Content-Type: text/html e Content-Length: Y (sendo Y o número de bytes do arquivo index.html), que pode ser obtido invocando as funções stat ou fstat. 4. Envie seu código do servidor modificado. Documentação da API de Sockets Você poderá encontrar a documentação da API de sockets no Unix/Linux nas man pages (páginas de manual invocadas pelo comando de terminal man). Algumas funções como snprintf e index estão na seção 3, e o uso de endeços está na seção 7 (IP e IPv6). 7
Trabalho 01: Cliente e Servidor Python
Trabalho 01: Cliente e Servidor Python Redes de Computadores 1 Descrição Este trabalho deve ser entregue no Moodle até a data correspondente de entrega. Envie sua resposta somente em texto a não ser que
Sistemas de Operação Sockets
Sistemas de Operação Sockets O que é um socket? Uma interface de comunicação entre processos que podem ou não residir na mesma máquina, mas que não precisam estar relacionados. É usado normalmente para
TROCA DE MENSAGENS SOCKETS. Comunicando processos através de SOCKETS. SOCKETS com conexão. SOCKETS sem conexão
TROCA DE MENSAGENS SOCKETS Comunicando processos através de SOCKETS SOCKETS com conexão SOCKETS sem conexão SOCKETS Princípios dos sockets: 2. Fornecer uma interface geral permitindo a construção de aplicações
Sockets. André Restivo. April 29, Faculdade de Engenharia da Universidade do Porto. André Restivo (FEUP) Sockets April 29, / 27
Sockets André Restivo Faculdade de Engenharia da Universidade do Porto April 29, 2013 André Restivo (FEUP) Sockets April 29, 2013 1 / 27 Sumário 1 Introdução 2 Cliente/Servidor 3 API C++ 4 André Restivo
Programação com Sockets TCP e UDP - Cliente. Gustavo Leitão
Programação com Sockets TCP e UDP - Cliente Gustavo Leitão 5/24/2010 INTRODUÇÃO Objetivo da Aula OBJETIVO DA AULA Apresentar ao aluno conceitos e prática em sockets INTRODUÇÃO O que é um socket? INTRODUÇÃO
Aula de Socket. Rafael De Tommaso do Valle
Aula de Socket Rafael De Tommaso do Valle 20 de agosto de 2009 Socket O que é um socket? É uma interface com qual processos em diferentes hosts se comunicam através da rede; Também chamado de interface
Computação 2. Aula Profª. Fabiany Listas Duplamente Encadeadas
Computação 2 Aula 10.1 Listas Duplamente Encadeadas Profª. Fabiany [email protected] ListaEncadeada.h #ifndef _LISTAENCADEADA_H_ #define _LISTAENCADEADA_H_ #include #include #include
Introdução à Programação com Sockets. Fernando Jorge Silveira Filho Daniel Sadoc Menasché
Introdução à Programação com Sockets Fernando Jorge Silveira Filho [email protected] Daniel Sadoc Menasché [email protected] Visão Geral Objetivos: Realizar comunicação entre processos. Entender como
Servidor UDP. Programação Sockets Volnys Bernal. Servidor UDP Resumo das Chamadas UDP. Resumo de Chamadas UDP. Resumo de Chamadas UDP
2004-2015 Volnys Bernal 1 2004-2015 Volnys Bernal 2 Resumo das Chamadas UDP Volnys Borges Bernal [email protected] Departamento de Sistemas Eletrônicos Escola Politécnica da USP 2004-2015 Volnys Bernal
Curso de Programação C em Ambientes Linux Aula 05
Curso de Programação C em Ambientes Linux Aula 05 Centro de Engenharias da Mobilidade - UFSC Professores Gian Berkenbrock e Giovani Gracioli http://www.lisha.ufsc.br/c+language+course+resources Conteúdo
Cliente/Servidor. Programação com Sockets. Graça Bressan. Graça Bressan/LARC 2000 1
Cliente/Servidor Programação com Sockets Graça Bressan Graça Bressan/LARC 2000 1 Interface através de Sockets Socket é uma API ( Aplication Program Interface ) para acesso aos serviços do protocolo de
INF01018 Aula Prática 1 Cliente-Servidor e Multicast
1 / 30 INF01018 Aula Prática 1 Cliente-Servidor e Multicast Lucas Mello Schnorr, Alexandre Silva Caríssimi {lmschnorr,asc}@inf.ufrgs.br http://www.inf.ufrgs.br/ lmschnorr/ad/ INF01018 Sistemas Operacionais
Obter conhecimentos básicos sobre programação socket para desenvolver softwares clientes.
Objetivo: Obter conhecimentos básicos sobre programação socket para desenvolver softwares clientes. Atividade 1 Estude, compile, corrija (se necessário) e teste o programa hostbyaddr.c. Modifique o programa
MC823 Laboratório de Teleprocessamento e Redes
MC823 Laboratório de Teleprocessamento e Redes Primeiro Semestre 2008 Carlos R. Senna Prof. Edmundo R. M. Madeira Tecnologias de Comunicação 2 MC823 Funções para cliente-servidor UDP 3 well-known port
Estruturas de Dados Aula 6: Cadeias de 28/03/2010
Estruturas de Dados Aula 6: Cadeias de Caracteres 28/03/2010 Caracteres Caracteres são representados internamente por códigos numéricos Tipo char (inteiro pequeno ) 1 byte (8 bits) 256 caracteres possíveis
Introdução à Programação Sockets. Programação Sockets. (c) Volnys Bernal. Agenda. Introdução à Programação Sockets
00-0 Volnys Bernal 00-0 Volnys Bernal Agenda Introdução à Programação Sockets Volnys Borges Bernal [email protected] Departamento de Sistemas Eletrônicos Escola Politécnica da USP Interface de programação
OProtocolo RPC é um dos protocolos de aplicação mais utilizados, pois permite
Laboratório de Redes. Remote Procedure Call - RPC Pedroso 9 de março de 2006 1 Introdução 2 Conceitos básicos OProtocolo RPC é um dos protocolos de aplicação mais utilizados, pois permite que sejam criadas
Sockets IPv6 para C/C++ - Criando e Portando Aplicações
Sockets IPv6 para C/C++ - Criando e Portando Aplicações Rodrigo Regis dos Santos [email protected] 25 de Junho de 2009 Agenda O CGI.br e o NIC.br. O Protocolo IPv6. Interoperabilidade Portando Aplicações.
Programação TCP/IP (sockets)
Programação TCP/IP (sockets) Instituto Superior de Engenharia de Lisboa Departamento de Engenharia de Electrónica e Telecomunicações e de Computadores Redes de Computadores Aplicações 17-03-2010 Programação
INF 1620 P2-14/10/05 Questão 1 Nome:
INF 1620 P2-14/10/05 Questão 1 Considere um cadastro de produtos de um estoque, com as seguintes informações para cada produto: Código de identificação do produto: representado por um valor inteiro Nome
1 Exercícios com ponteiros
Computação para Informática - Prof. Adriano Joaquim de Oliveira Cruz Oitava Aula Prática - 29 de outubro de 2010 O objetivo desta aula prática é exercitar ponteiros e funções. 1 Exercícios com ponteiros
Bibliotecas. Apoio à Programação Distribuída. Socket. Socket. bibliotecas bibliotecas+ferramentas linguagens de programação distribuídas
Apoio à Programação Distribuída bibliotecas bibliotecas+ferramentas linguagens de programação distribuídas flexibilidade de programação disponibilidade da ferramenta facilidade de desenvolvimento e reuso
Vetores II. Strings Leitura e exibição Biblioteca string.h Operações com Strings. Matrizes Definição de Acesso Operações com Matrizes
Strings Leitura e exibição Biblioteca string.h Operações com Strings Matrizes Definição de Acesso Operações com Matrizes Utilidade da String Facilidade de manipulação de um grande conjunto de caracteres
Sockets - Conceitos Básicos. COMUNICAÇÃO ENTRE PROCESSOS Sockets. Conceitos Básicos. Tipos de Sockets
Sockets - Conceitos Básicos COMUNICAÇÃO ENTRE PROCESSOS Sockets! Sockets são uma forma de IPC (InterProcess Communication ) fornecida pela 4.3 BSD que fornecem comunicação entre processos residentes em
Algoritmos e Estruturas de dados
Algoritmos e Estruturas de dados Listas Encadeadas Prof. Dr. Fábio Rodrigues de la Rocha (Listas Encadeadas) 1 / 21 Definição: Anteriormente estudamos listas encadeadas que foram implementadas como vetores
1 Exercícios com ponteiros
Computação para Informática Funções e Ponteiros1 EXERCÍCIOS COM PONTEIROS Computação para Informática - Prof. Adriano Joaquim de Oliveira Cruz Aula Prática - Funções e ponteiros O objetivo desta aula prática
Comunicação entre Processos
Comunicação entre Processos Comunicação memória compartilhada troca de mensagens base de comunicação em sistemas distribuídos Mensagens básicas send (destino, msg) receive (origem, mensagem) questões semântica
Computação 2. Aula 8. Profª. Fabiany Arquivos
Computação 2 Aula 8 Arquivos Profª. Fabiany [email protected] E/S com Arquivos A linguagem C não possui nenhum comando de E/S. Todas as operações de E/S ocorrem mediante chamadas a funções de biblioteca
sockets interprocess communication Taisy Weber
sockets interprocess communication Taisy Weber Comunicação entre processos Mecanismos Pipes, FIFO (named pipes), semáforos, message queues. Memória compartilhada. Sockets Definição, chamadas de sistemas,
Comunicação entre Processos. 1. Pipes 2. Fifos 3. Sockets
Comunicação entre Processos 1. Pipes 2. Fifos 3. Sockets Pipes Implementa um canal de comunicação associado a um processo Limitações: Os dados apenas fluem num sentido Só podem ser usados entre processos
Redes de Computadores
Redes de Computadores Camada de Aplicação HTTP FTP SMTP Slide 1 Mensagem de Requisição HTTP linha de pedido (comandos GET, POST,HEAD ) linhas de cabeçalho Carriage return, line feed indica fim da mensagem
Comunicação entre Processos por Troca de Mensagens. Prof. Celso maciel da Costa
Comunicação entre Processos por Troca de Mensagens Prof. Celso maciel da Costa Troca de Mensagens Com memória compartilhada: os processo compartilham variáveis e trocam informações através do uso de variáveis
Relatório do Laboratório 3
Relatório do Laboratório 3 Diogo Costa e Lucas Magrini Rigo 180188 e 161064 23 de setembro de 2011 Universidade Federal do Rio Grande do Sul INF01154 Redes de Computadores N For: Valter Roesler 1 Introdução
INF 1620 P2-01/11/03 Questão 1 Nome:
INF 1620 P2-01/11/03 Questão 1 Considere a implementação de uma lista encadeada para armazenar as notas dos alunos de uma turma dada pelo tipo abaixo: struct lista { char nome[81]; int mat; float p1, p2,
Exercício Programa Mini Web Server
2004-2017 Volnys Bernal 1 Exercício Programa PSI 2653 Meios Eletrônicos Interativos I 2004-2017 Volnys Bernal 2 Objetivo Desenvolvimento de um programa servidor WEB Composição do grupo 4 pessoas (obrigatório)
Programação Estruturada Prof. Rodrigo Hausen Organização e Gerenciamento de Memória
Programação Estruturada Prof. Rodrigo Hausen http://progest.compscinet.org Organização e Gerenciamento de Memória 1 AULA PASSADA - vetores ou arrays Declaração de um vetor (array) em C: tipo nome[tamanho];
Mônica Oliveira Primo de Lima Edervan Soares Oliveira TRABALHO SOBRE PROTOCOLO HTTP
Mônica Oliveira Primo de Lima Edervan Soares Oliveira TRABALHO SOBRE PROTOCOLO HTTP 1. FORMATO DA MENSAGEM HTTP Assim como todo protocolo, o HTTP tem possui definições de como devem ser as mensagens. Existem
Strings. Introdução. Definição de strings. Criação/Declaração de strings. Inicialização de strings. Manipulação de strings. Exemplos.
Introdução Definição de strings. Criação/Declaração de strings. Inicialização de strings. Manipulação de strings. Exemplos. 1 definições Uma string é uma sequência, um conjunto, ou uma cadeia de caracteres.
INF 1620 P1-11/04/08 Questão 1 Nome:
INF 1620 P1-11/04/08 Questão 1 Nas Olimpíadas, em uma determinada modalidade esportiva, os competidores recebem a nota de quatro jurados e a nota final é o resultado da média das quatro notas menos um
Sistemas Distribuídos
Sistemas Distribuídos Universidade Federal do ABC Turma: Ciência da Computação Prof. Dr. Francisco Isidro Massetto Introdução: Sockets Para estabelecer a Comunicação Interprocesso nos Sistemas Distribuídos,
Criação de Processos Fork( ) Exec( )
Criação de Processos Fork( ) Exec( ) 8/23/18 1 Chamadas de Sistema: Process Management 2 Chamada fork( ) / exec( ) 3 Esboço de uma shell while (TRUE) { /* repeat forever */ type_prompt( ); /* display prompt
Sistemas Operacionais - Básico e Avançado - Prof. Celso Maciel da Costa Mestrado em Informática - PUCRS
Sistemas Operacionais - Básico e Avançado - Prof. Celso Maciel da Costa Mestrado em Informática - PUCRS Processo Usuário Processo Usuário SO IPC em um mesmo sistema 2 Processo Usuário Processo usuário
Programação em C/C++
OO Engenharia Eletrônica - Programação em C/C++ Slides 20: TCP/IP em Winsocks 2. API do Windows para programar aplicativos que utilizam o protocolo TCP/IP. Prof. Jean Marcelo SIMÃO TCP/IP em Winsocks 2
