Sistemas de Operação Sockets



Documentos relacionados
Programação com Sockets TCP e UDP - Cliente. Gustavo Leitão

Sistemas de Operação Sockets

TROCA DE MENSAGENS SOCKETS. Comunicando processos através de SOCKETS. SOCKETS com conexão. SOCKETS sem conexão

Programação de Sockets em C/C++

Comunicação entre Processos

Engenharia Elétrica Eletrônica Slides 20: TCP/IP em Winsocks 2. API do Windows para programar utilizando o protocolo TCP/IP Prof. Jean Marcelo SIMÃO

06/10/2015. Modelo TCP/IP Camada de Transporte DISCIPLINA: TECNOLOGIA DE REDES DE COMPUTADORES. UDP User Datagram Protocol. UDP User Datagram Protocol

Aula Prática. Comunicação em SOCKTS. Disciplina: INF01151

MC823 Atividade 1: Cliente/Servidor TCP Iterativo. 3 Modificando o servidor para retornar data e hora

Bibliotecas. Apoio à Programação Distribuída. Socket. Socket. bibliotecas bibliotecas+ferramentas linguagens de programação distribuídas

Introdução à Programação com Sockets. Fernando Jorge Silveira Filho Daniel Sadoc Menasché

Introdução à Programação Sockets

sockets interprocess communication Taisy Weber

Aula de Socket. Rafael De Tommaso do Valle

INF01018 Aula Prática 1 Cliente-Servidor e Multicast

Sumário. Introdução ao TCP/IP e à Internet API Sockets para comunicação via redes Exemplos

Relatório do Laboratório 3

Programação em Sockets visando verificar a diferença entre transmissão confiável (TCP) e não confiável (UDP)

Um Tutorial sobre Sockets Parte I

Sockets. André Restivo. April 29, Faculdade de Engenharia da Universidade do Porto. André Restivo (FEUP) Sockets April 29, / 27

Programação TCP/IP (sockets)

Comunicação entre processos. Sistema centralizado

Servidor TCP. Programação Sockets. (c) Volnys Bernal. Servidor TCP Resumo das Chamadas TCP. Resumo das Chamadas TCP. Resumo das Chamadas TCP

MC823 Laboratório de Teleprocessamento e Redes

Cliente UDP. Programação sockets. Agenda. Cliente UDP. Resumo de Chamadas UDP. Resumo das chamadas UDP. Resumo de Chamadas UDP.

Programação de Aplicações em. Rede usando Sockets

Programação com Sockets. Redes de Computadores I 2007/2008

Servidor TCP Volnys Borges Bernal Depto de Engenharia de Sistemas Eletrônicos Escola Politécnica da USP

Sistemas Operacionais - Básico e Avançado - Prof. Celso Maciel da Costa Mestrado em Informática - PUCRS

Cliente/Servidor. Programação com Sockets. Graça Bressan. Graça Bressan/LARC

Servidor UDP Volnys Borges Bernal Departamento de Sistemas Eletrônicos Escola Politécnica da USP

Comunicação entre Processos

Introdução à Programação Sockets. Programação Sockets. (c) Volnys Bernal. Agenda. Introdução à Programação Sockets

Servidor UDP. Programação Sockets Volnys Bernal. Servidor UDP Resumo das Chamadas UDP. Resumo de Chamadas UDP. Resumo de Chamadas UDP

Sockets - Conceitos Básicos. COMUNICAÇÃO ENTRE PROCESSOS Sockets. Conceitos Básicos. Tipos de Sockets

Tutorial de Sockets - Parte I Por: Frederico Perim

Sockets. Bruno Guimarães Lucas Rossini

Modelo Cliente/Servidor e Introdução a Sockets

Servidor TCP. Programação Sockets. (c) Volnys Bernal. Servidor TCP Resumo das Chamadas TCP. Resumo das Chamadas TCP. Resumo das Chamadas TCP

Servidor TCP. Programação Sockets. (c) Volnys Bernal. Servidor TCP Resumo das Chamadas TCP. Resumo das Chamadas TCP. Resumo das Chamadas TCP

Cliente TCP. Programação sockets. Agenda. Cliente TCP. Chamadas sockets para TCP. Chamada socket() Chamada socket()

Sistemas Distribuídos (Parte 4 - Aplicação Distribuída)

Programação Orientada a Objetos para Redes de Computadores. Modelo Cliente-Servidor. Comunicação entre Processos. O que é um Socket?

API de Sockets. Modelo Cliente/Servidor (2/2) Modelo Cliente/Servidor (1/2) José Pedro Oliveira Sistemas Operativos I

Programação Orientada a Objetos para Redes de Computadores

Cliente-servidor com Sockets TCP

Comunicação entre Processos. 1. Pipes 2. Fifos 3. Sockets

Redes de Computadores

Cliente UDP. Programação sockets. Agenda. Cliente UDP. Resumo de Chamadas UDP. Chamadas UDP. Resumo de Chamadas UDP.

Redes de Computadores I

Eng.ª Informática. Redes de Computadores. Frequência. 4 de Julho de 2006

Soquetes TCP. Jean Ribeiro Damasceno. Escola de Engenharia Universidade Federal Fluminense (UFF) Rua Passo da Pátria, 156 Niterói RJ Brasil

Programação com sockets (em Java)

Sistemas Operacionais II

Trabalho 02: Cliente e Servidor em C

Por Fernando Koyanagi

Redes de Computadores II

Cliente-servidor com Sockets TCP

Sistemas Operacionais:

Comunicação em Sistemas Distribuídos. Conceitos: Paradigma C/S. Conceitos: Paradigma C/S. Paradigma Cliente/Servidor

REDES INTEGRADAS DE TELECOMUNICAÇÕES I 2012 / 2013

Introdução à Programação Sockets. Programação Sockets. (c) Volnys Bernal. Agenda. Introdução à Programação Sockets

29-Aug-07. Histórico. Interfaces e Periféricos Redes como interfaces. Abstração da infraestrutura de rede como interface

Redes de Computadores (RCOMP 2014/2015)

Cliente UDP. Programação sockets. Agenda. Cliente UDP. Resumo de Chamadas UDP. Chamadas UDP. Resumo de Chamadas UDP.

No projeto das primeiras redes de computadores, o hardware foi a principal preocupação e o software ficou em segundo plano.

Obter conhecimentos básicos sobre programação socket para desenvolver softwares clientes.

Capítulo II Modelos de Programação Distribuída

Introdução à Programação Sockets. Programação Sockets. (c) Volnys Bernal. Agenda. Introdução à Programação Sockets

UMA ABORDAGEM SOBRE A INTERFACE DE PROGRAMAÇÃO DE APLICAÇÕES SOCKETS E A IMPLEMENTAÇÃO DE UM SERVIDOR HTTP

Redes de Computadores. Arquitetura de Protocolos Profa. Priscila Solís Barreto

Aula 2 Arquitetura de Redes. Prof. Dr. S. Motoyama

Resolução de Nomes e Endereços

1 Projeto de software de clientes. 1

Leandro Soares de Sousa (DSc.) Página: Aula 05 - desenvolvimento com sockets

Redes de Computadores. 1 Questões de múltipla escolha. TE090 - Prof. Pedroso. 30 de novembro de Exercício 1: Considere:

Comunicação entre processos

Programação em C/C++

Programação Engenharia Informática (11543) 1º ano, 1º semestre Tecnologias e Sistemas de Informação (6619) 1º ano, 1º semestre

Terminologia. computador onde executam aplicações do usuário ou do sistema. que solicita serviços a um Servidor em benefício de um usuário.

Protocolo de resolução de endereços: ARP

Linguagem C Tipos de Dados. void; escalares; sizeof Vectores; strings em C Estruturas Introdução ao pré-processador

Programação de Sistemas. Sockets. Programação de Sistemas Sockets : 1/66

socket Objetivo: aprender a construir aplicações cliente/servidor que se comunicam usando sockets

Problemas relacionados a exclusão mútua

Protocolos de Aplicação

Programação Estruturada I

Introdução a Programação. Ponteiros e Strings, Alocação Dinâmica

Sockets em Ruby. Curso de Tecnologia em Redes de Computadores Programação para Redes

Sockets: Sumário. Resumo das Propriedades de UDP e de TCP

Redes de Computadores (PPGI/UFRJ)

Leandro Soares de Sousa (DSc.) Página: Parte III

Programação Paralela e Distribuída. Prof. Cidcley T. de Souza

Disciplina de Redes de Computadores Estudo Dirigido para a Prova II Professor Dr Windson Viana de Carvalho

Resolução de Nomes Volnys Borges Bernal Deparatamento de Sistemas Eletrônicos Escola Politécnica da USP

Listas (Parte 2) Túlio Toffolo BCC202 Aula 10 Algoritmos e Estruturas de Dados I

Camada de Transporte, protocolos TCP e UDP

Rede de Computadores

Redes de Computadores. Protocolo TCP/IP Profa. Priscila Solís Barreto

Transcrição:

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 implementar um modelo cliente/servidor em aplicações. Funcionamento geral: uma aplicação cria um socket o tipo do socket determina o estilo de comunicação (fiável vs. não fiável) envia dados para o socket para transmissão para a rede recebe dados do socket (enviados através da rede por alguma aplicação) DCC/FCUP Fernando Silva Sistemas de Operação 1

Existem 2 tipos principais de sockets SOCK_STREAM (a.k.a. TCP) - definem canais: ligados bi-direccionais, fiáveis na entrega, com ordem de comunicação assegurada, analogia: ligação telefónica (precisa que se estabeleça um circuito virtual) SOCK_DGRAM (a.k.a. UDP) - definem canais: sem noção de ligação (os pacotes incluem o endereço de cada pacote) não são fiáveis na entrega, não garantem ordem analogia: os serviços de correio postal (e.g. CTT). DCC/FCUP Fernando Silva Sistemas de Operação 2

Criação de sockets em C int sockid= socket( domain, type, protocol) sockid: descriptor do socket, um inteiro; valor -1 se não puder ser criado; domain: inteiro a especificar o domínio da comunicação, e.g. AF_INET (protocolo IPv4) é comum; type: tipo de comunicação: SOCK_STREAM ou SOCK_DGRAM protocol: especifica o protocolo (habitualmente é 0 i.e. protocolo IP); ver lista em /etc/protocols. Esta função apenas cria a interface do socket! DCC/FCUP Fernando Silva Sistemas de Operação 3

Atribuir um nome ao socket a função bind Para que um socket possa ser usado por aplicações cliente numa rede tem de ter nome; int status= bind( sockid, &addrport, size) status: código de erro; -1 se o bind falhar; sockid: descriptor do socket; addrport: estrutura com o endereço (IP) e porta da máquina (habitualmente INADDR_ANY - é escolhido um endereço local) size: o tamanho (em bytes) da estrutura addrport Nota: cada máquina tem 65536 portas, estando algumas reservadas para aplicações específicas e.g. portas 20 e 21 FTP, 80 HTTP, etc. DCC/FCUP Fernando Silva Sistemas de Operação 4

O bind nem sempre é necessário Quando o socket é do tipo: SOCK_DGRAM se apenas fizer envio, não precisa do bind: o OS procura uma porta sempre que necessário; se recebe, então precisa do bind; SOCK_STREAM destino determinado no setup da comunicação; não precisa de saber a porta que envia (no setup da comunicação, a parte que recebe é informada da porta) DCC/FCUP Fernando Silva Sistemas de Operação 5

Estabelecimento da comunicação: SOCK_STREAM Não precisa de se estabelecer uma ligação prévia As ligações são estabelecidas por dois tipos de participantes: passivo: espera que um participante activo faça o pedido de ligação; activo: inicia um pedido de ligação ao lado passivo; uma vez estabelecida a aligação, os participantes activo e passivo são análogos, i.e. ambos podem enviar e receber dados qualquer um pode terminar a ligação DCC/FCUP Fernando Silva Sistemas de Operação 6

Estabelecimento da comunicação (cont.) Os passos no estabelecimento de uma ligação são: Passo 1: (part. passivo) fica à escuta de pedidos de ligação Passo 2: (part. activo) faz pedido e estabelece ligação Passo 3: (part. passivo) aceita pedido de ligação Passo 4: (part. passivo) comunica dados Passo 5: (part. activo) comunica dados quando um pedido de ligação é aceite, tal acontece num novo socket o socket antigo continua à escuta de outros participantes activos DCC/FCUP Fernando Silva Sistemas de Operação 7

Funções de ligação: listen e accept Funções invocadas pelo participante passivo: int status= listen( sockid, queuelen) status: 0 se estiver em escuta; -1 se houver erro; sockid: descriptor do socket; queuelen: número de participantes activos que podem esperar por uma ligação esta função é não-bloqueante, isto é retorna de imediato int newsock= accept( sockid, &name, &namelen) newsock: o novo socket para a comunicação sockid: descriptor do socket de escuta name: endereço do participante activo (struct sockaddr) namelen: sizeof(name) DCC/FCUP Fernando Silva Sistemas de Operação 8

esta função é bloqueante, isto é, só retorna após ser estabelecida a ligação; DCC/FCUP Fernando Silva Sistemas de Operação 9

Pedido de ligação int status= connect( sockid, &name, &namelen) status: 0 se a ligação for bem sucedida; -1 caso contrário; sockid: descriptor do socket de ligação; name: endereço do participante passivo (struct sockaddr) namelen: sizeof(name) esta função é bloqueante, isto é só retorna após ser estabelecida a ligação; DCC/FCUP Fernando Silva Sistemas de Operação 10

Envio/Recepção de dados (SOCK_STREAM) int count= send( sockid, &buf, len, flags) count: bytes enviados (-1 se erro) sockid: descriptor do socket de comunicação; buf: char[], buffer a ser transmitido len: tamanho do buffer (bytes) flags: opções especiais (habitualmente 0) int count= recv( sockid, &buf, len, flags) count: bytes recebidos (-1 se erro) buf: void[], buffer recebido len: tamanho do buffer (bytes) flags: opções especiais (habitualmente 0) funções bloqueantes; retornam após envio/recepção; DCC/FCUP Fernando Silva Sistemas de Operação 11

Envio/Recepção de dados (SOCK_DGRAM) int count= sendto( sockid, &buf, len, flags, &addr, addrlen) count, sockid, buf, len: como no send addr: endereço do destino (struct sockaddr) addrlen: sizeof(addr) int count= recvfrom( sockid, &buf, len, flags, &addr, addrlen) count, sockid, buf, len: como no recv addr: endereço da origem (struct sockaddr) addrlen: sizeof(addr) funções bloqueantes; retornam após envio/recepção; DCC/FCUP Fernando Silva Sistemas de Operação 12

Fecho de ligação Quando se termina de usar um socket, deve-se fechá-lo; int status= close( sockid) status: 0 se bem sucedido; -1 caso contrário; sockid: descriptor do socket a fechar; a operação de fecho liberta uma ligação (SOCK_STREAM) e liberta a porta usada pelo socket; DCC/FCUP Fernando Silva Sistemas de Operação 13

A estrutura sockaddr Genérica: 1 struct sockaddr { 2 u_short sa_family ; / / address family, hab. AF_UNIX 3 char sa_data [ 1 4 ] ; / / como usar os ú l t i m o s 14 bytes 4 } ; Específica para Internet: 1 struct sockaddr_in { 2 short sin_family ; / / address family, hab. AF_INET 3 u_short sin_port ; / / # porta (0 65535) 4 struct in_addr sin_addr ; / / i n t e r n e t address 5 char sa_zero [ 8 ] ; / / não usado 6 } ; 7 struct in_addr { 8 unsigned long s_addr ; / / 32 b i t (4 bytes ) 9 } ; DCC/FCUP Fernando Silva Sistemas de Operação 14

Exemplo de um servidor (envia Ola Mundo ) 1 #include < s t d i o. h> 2 #include < s t d l i b. h> 3 #include < u n i s t d. h> 4 #include <errno. h> 5 #include < s t r i n g. h> 6 #include <sys / types. h> 7 #include <sys / socket. h> 8 #include < n e t i n e t / i n. h> 9 #include <arpa / i n e t. h> 10 #define MYPORT 3490 / / porta de l i g a ç ã o para c l i e n t e s 11 #define BACKLOG 10 / / max l i g a ç õ e s pendentes 12 13 int main (void ) 14 { 15 int sockfd, new_fd ; / / escuta em sockfd, novas l i g a ç õ e s em newfd 16 struct sockaddr_in my_addr ; / / minha i n f o de endereço 17 struct sockaddr_in cl_addr ; / / i n f o de endereço de c l i e n t e s 18 socklen_t sin_size ; 19 20 if ( ( sockfd = socket ( AF_INET, SOCK_STREAM, 0) ) == 1) { 21 perror ("socket" ) ; 22 exit ( 1 ) ; 23 } 24 my_addr.sin_family = AF_INET ; / / network byte order DCC/FCUP Fernando Silva Sistemas de Operação 15

25 my_addr.sin_port = htons (MYPORT ) ; / / converte para s h o r t 26 my_addr. sin_addr. s_addr = INADDR_ANY ; / / d e t. automaticamente IP 27 memset (&(my_addr.sin_zero ), '\0', 8) ; / / r e s t o do s t r u c t a zero 28 29 if (bind (sockfd, (struct sockaddr * ) &my_addr, sizeof (struct sockaddr ) ) == 1) { 30 perror ("bind" ) ; 31 exit ( 1 ) ; 32 } 33 if ( listen ( sockfd, BACKLOG ) == 1) { 34 perror ("listen" ) ; 35 exit ( 1 ) ; 36 } 37 while ( 1 ) { / / c i c l o de espera de l i g a ç õ e s 38 sin_size = sizeof ( struct sockaddr_in ) ; 39 if ( (new_fd= accept (sockfd, ( struct sockaddr * ) &cl_addr, &sin_size ) ) == 1) { 40 perror ("accept" ) ; 41 continue ; 42 } 43 printf ("server: pedido de ligacao de %s\n",inet_ntoa (cl_addr.sin_addr ) ) ; 44 45 if (! fork ( ) ) { / / processo f i l h o para responder ao pedido 46 close (sockfd ) ; / / não precisa do l i s t e n e r 47 if (send (new_fd, "Ola, mundo!\n", 14, 0) == 1) { 48 perror ("send" ) ; 49 close (new_fd ) ; exit ( 0 ) ; 50 } 51 } 52 close (new_fd ) ; / / pai j á não precisa deste d e s c r i p t o r 53 return 0; DCC/FCUP Fernando Silva Sistemas de Operação 16

54 } 55 } DCC/FCUP Fernando Silva Sistemas de Operação 17

Exemplo de um cliente 1 #include < s t d i o. h> 2 #include < s t d l i b. h> 3 #include < u n i s t d. h> 4 #include <errno. h> 5 #include < s t r i n g. h> 6 # include <netdb. h> 7 #include <sys / types. h> 8 #include < n e t i n e t / i n. h> 9 #include <sys / socket. h> 10 11 #define PORT 3490 / / porta de l i g a ç ã o 12 #define MAXDATASIZE 100 / / num. max de bytes no b u f f e r 13 14 int main (int argc, char * argv [ ] ) 15 { / / server_addr must be i n i t i a l i z e d to the server address ( IP and p o r t ) 16 int sockfd, numbytes ; 17 char buf [ MAXDATASIZE ] ; 18 struct hostent * he ; 19 struct sockaddr_in cl_addr ; / / i n f o do endereço de l i g a ç ã o 20 21 if (argc!= 2) { 22 fprintf (stderr,"usar: client hostname\n" ) ; 23 exit ( 1 ) ; 24 } DCC/FCUP Fernando Silva Sistemas de Operação 18

25 26 if ( (he=gethostbyname (argv [ 1 ] ) ) == NULL ) { / / host i n f o 27 perror ("gethostbyname" ) ; 28 exit ( 1 ) ; 29 } 30 31 if ( ( sockfd = socket ( AF_INET, SOCK_STREAM, 0) ) == 1) { 32 perror ("socket" ) ; 33 exit ( 1 ) ; 34 } 35 36 cl_addr.sin_family = AF_INET ; / / network byte order 37 cl_addr.sin_port = htons (PORT ) ; / / s h o r t 38 cl_addr.sin_addr = * ( ( struct in_addr * )he >h_addr ) ; 39 memset (&(cl_addr.sin_zero ), '\0', 8) ; / / r e s t o da e s t r u t u r a a zero 40 41 if (connect (sockfd, (struct sockaddr * ) &server_addr, sizeof (struct sockaddr ) ) == 1) { 42 perror ("connect" ) ; 43 exit ( 1 ) ; 44 } 45 46 if ( ( numbytes=recv ( sockfd, buf, MAXDATASIZE 1, 0) ) == 1) { 47 perror ("recv" ) ; 48 exit ( 1 ) ; 49 } 50 buf [numbytes ] = '\0' ; 51 printf ("Recebeu: %s",buf ) ; 52 close (sockfd ) ; DCC/FCUP Fernando Silva Sistemas de Operação 19

53 return 0; 54 } DCC/FCUP Fernando Silva Sistemas de Operação 20