comunicação entre processos - sockets. conceitos básicos sockets são uma forma de ipc (...

Post on 21-Apr-2015

107 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Comunicação entre Comunicação entre Processos - Processos -

SocketsSockets

Conceitos BásicosConceitos Básicos

Sockets são uma forma de IPC Sockets são uma forma de IPC ( InterProcess Communication ) fornecida ( InterProcess Communication ) fornecida pela 4.3 BSD que fornecem comunicação pela 4.3 BSD que fornecem comunicação entre processos residentes em sistema único entre processos residentes em sistema único ou processos residentes em sistemas ou processos residentes em sistemas remotos.remotos.

Conceitos BásicosConceitos Básicos

Sockets criados por diferentes programas Sockets criados por diferentes programas usam nomes para se referenciarem.usam nomes para se referenciarem.

Esses nomes geralmente devem ser Esses nomes geralmente devem ser traduzidos em endereços para uso.traduzidos em endereços para uso.

Um endereço é especificado por um Um endereço é especificado por um domínio.domínio.

Processo Usuário Processo Usuário

SO

IPC em um mesmo sistema

Processo Usuário Processo usuário

SO SO

Comunicação de Processos Remotos

Tipos de SocketsTipos de Sockets

– STREAM SOCKET - Provê sequenciamento e STREAM SOCKET - Provê sequenciamento e fluxo bidirecinal. Este tipo de socket transmite fluxo bidirecinal. Este tipo de socket transmite dados sobre um base confiável e com dados sobre um base confiável e com capacidade de transmissão de dados expressos.capacidade de transmissão de dados expressos.

– No domínio UNIX, o SOCKET_STREAM No domínio UNIX, o SOCKET_STREAM trabalha igual a um pipe, no domínio trabalha igual a um pipe, no domínio INTERNET este tipo de socket é implementado INTERNET este tipo de socket é implementado sobre TCP/IP.sobre TCP/IP.

Tipos de SocketsTipos de Sockets

– SOCK_DGRAM - Suporta fluxo de dados SOCK_DGRAM - Suporta fluxo de dados bidirecional mas não oferece um serviço bidirecional mas não oferece um serviço confiável como STREAM_SOCKET.confiável como STREAM_SOCKET.

– Mensagens duplicadas e em ordem diferente Mensagens duplicadas e em ordem diferente ( não sequenciadas ) são problemas que podem ( não sequenciadas ) são problemas que podem aparecer neste tipo de socket.aparecer neste tipo de socket.

Tipos de SocketsTipos de Sockets

– RAW_SOCKET - permite o acesso a interface RAW_SOCKET - permite o acesso a interface de protocolos de rede. Disponível para usuários de protocolos de rede. Disponível para usuários avançados e que possuam autoridade de usuário avançados e que possuam autoridade de usuário rootroot

– permite que uma aplicação acesse diretamente permite que uma aplicação acesse diretamente protocolos de comunicação de baixo nível.protocolos de comunicação de baixo nível.

– permite a construção de novos protocolos permite a construção de novos protocolos sobre os protocolos de baixo nível já existentes sobre os protocolos de baixo nível já existentes

– normalmente orientados a datagramanormalmente orientados a datagrama

AssociaçãoAssociação

O socket é criado sem nomeO socket é criado sem nome É necessário um nome para para a sua É necessário um nome para para a sua

utilizaçãoutilização Os processos são ligados por uma Os processos são ligados por uma

associaçãoassociação Associação: Associação: <protocolo, end. máquina local, porta local, end. <protocolo, end. máquina local, porta local, end.

máquina remota, porta remota>máquina remota, porta remota>

Domínios e ProtocolosDomínios e Protocolos

O espaço no qual o endereço é especificado O espaço no qual o endereço é especificado é chamado de domínioé chamado de domínio

Domínios básicos:Domínios básicos:» INTERNET - AF_INET - os endereços consistem INTERNET - AF_INET - os endereços consistem

do end. de rede da máquina e da identificação do no. do end. de rede da máquina e da identificação do no. da porta, o que permite a comunicação entre da porta, o que permite a comunicação entre processos de sistemas diferentesprocessos de sistemas diferentes

» Unix: AF_UNIX - os processos se comunicam Unix: AF_UNIX - os processos se comunicam referenciando um pathname, dentro do espaço de referenciando um pathname, dentro do espaço de nomes do sistema de arquivosnomes do sistema de arquivos

Domínios e ProtocolosDomínios e Protocolos

Domínio InternetDomínio Internet– Implementação Unix da protocolo TCP/UDP/IPImplementação Unix da protocolo TCP/UDP/IP– Consistem de:Consistem de:

» end. de rede da máquinaend. de rede da máquina

» identificação do no. da portaidentificação do no. da porta

– Permitem a comunicação entre máquinas Permitem a comunicação entre máquinas diferentesdiferentes

– Conexões sob a forma de sockets do tipo stream Conexões sob a forma de sockets do tipo stream e do tipo datagramase do tipo datagramas

Tipos de SocketsTipos de Sockets

Socket StreamSocket Stream– conexões confiáveisconexões confiáveis

DatagramasDatagramas– não fornecem segurançanão fornecem segurança

Protocolos TCP/IP

ProcessoA

ProcessoB

TCP UDP

IP

Interfacehardware

IP

• Internetwork Protocol• Roteamento de mensagens na rede• Unidade: datagramas• Fragmentação de pacotes (se > MTU)• Entrega não confiável de pacotes

TCP

• Transmission Control Protocol• Para comunicação longa (conexão)• Confiável• Transmissão de fluxo de dados: Não respeita limites de mensagens• Baixo desempenho em comunicações curtas (?)• Usos típicos:

• Login remoto• Transferência de arquivo

UDP

• User Datagram Protocol• Para comunicação curta (sem conexão)• Não confiável• Transmissão de pacotes: respeita limites de mensagens• Pouco prático para comunicações longas (confiabilidade precisa ser programada)• Usos típicos:

• RPC• Broadcast

Porta

• “Endereço” para um processo comunicante• Inteiro de 16 bits (definido pelo usuário)• Portas 1 a 1023 são do sistema• Portas de TCP independentes das de UDP

Associação

• Definida por

• Um protocolo: TCP ou UDP• Endereço IP local• Porta local• Endereço IP distante• Porta distante

Comunicação por sockets

Servidor Cliente 1

kernelkernel

socket socket

conexão

rede

Comunicação via TCP

Servidor

socket ( ) Cria um socket com - Família (ou domínio): UNIX, Internet, XNS - Tipo: stream, datagrama, puro - Protocolo (por conseq.): TCP, UDP

sockfd = (int) socket (int family, int type, int protocol)sockfd (int) = socket int) family int ,type int ,protocol(

Comunicação via TCP

Servidor

socket ( )

bind ( )

Atribui ao socket - Endereço Internet (pode ser “any”) - Porta de comunicação

ret = (int) bind (int sockfd, struct sockaddr *myaddr, int addrlen) ret = (int)bind int) sockfd struct sockaddr ,myaddr*int ,addrlen (

Comunicação via TCP

Servidor

socket ( )

bind ( )

listen ( )

Declara - Que está pronto para receber conexões - Até quantas devem ser enfileiradas

ret = (int) listen (int sockfd, int backlog) ret = (int)listen int) sockfdint ,backlog (

Comunicação via TCPServidor

socket ( )

bind ( )

listen ( )

accept ( )

newsock = (int) accept (int sockfd, struct sockaddr *peer, int *addrlen)newsock (int) = accept int) sockfd* struct sockaddr ,peerint ,addrlen* (

• Bloqueia até que haja pedido de conexão• Quando houver algum, aceita

Comunicação via TCPServidor

socket ( )

bind ( )

listen ( )

accept ( )

socket ( )

Cliente

• Cria um socket idêntico ao do servidor (mesma família e tipo)

sockfd = (int) socket (int family, int type, int protocol)sockfd (int) = socket int) family int ,type int ,protocol(

Comunicação via TCPServidor

socket ( )

bind ( )

listen ( )

accept ( )

socket ( )

connect ( )

Cliente

• Pede uma conexão ao servidor• Fica bloqueado ou retorna erro• Se aceito, fecha a conexão

ret = (int) connect (int sockfd, struct sockaddr *servaddr, int addrlen)ret = (int)connect int) sockfd * struct sockaddr ,servaddr int ,addrlen(

estabelecimento de conexão

Comunicação via TCPServidor

socket ( )

bind ( )

listen ( )

accept ( )

socket ( )

connect ( )

send ( )

estabelecimento de conexão

Cliente

• Envia uma seqüência de bytes pela conexão

nbytes = (int) send (int sockfd, char *buf, int nbytes, int flags)nbytes(int) = send int) sockfd * char ,buf int ,nbytes int ,flags(

Comunicação via TCPServidor

socket ( )

bind ( )

listen ( )

accept ( )

recv ( )

socket ( )

connect ( )

send ( )

estabelecimento de conexão

solicitação

Cliente

• Recebe (parte da ) msg enviada por send ( )

nbytes = (int) recv (int sockfd, char *buf, int nbytes, int flags)nbytes(int) = recv int) sockfd * char ,buf int ,nbytes int ,flags(

Comunicação via TCPServidor

socket ( )

bind ( )

listen ( )

accept ( )

recv ( )

send ( )

socket ( )

connect ( )

send ( )

recv ( )

estabelecimento de conexão

solicitação

resposta

processamento

Cliente

• Transmite ou confirma msgs faltantes• Encerra a conexão• Fecha o socket

close ( ) close ( )

ret = (int) close (int sockfd)ret = (int)close int) sockfd (

Comunicação via TCPServidor

socket ( )

bind ( )

listen ( )

accept ( )

recv ( )

send ( )

socket ( )

connect ( )

send ( )

recv ( )

estabelecimento de conexão

solicitação

resposta

processamento

Cliente

• Diagrama completo

close ( ) close ( )

Comunicação via UDP

Servidor

socket ( ) socket ( )

Cliente

• Cliente e servidor criam seus sockets• Família = Internet, tipo = datagrama

Comunicação via UDP

Servidor

socket ( )

bind ( )

socket ( )

bind ( )

Cliente

• Cliente e servidor definem endereços

Comunicação via UDP

Servidor

socket ( )

bind ( )

recvfrom ( )

socket ( )

bind ( )

Cliente

• Recebe pacote enviado do endereço informado• Se não houver nada, bloqueia

nbytes = (int) recvfrom (int sockfd, char *buf, int nbytes, int flags, struct sockaddr *from, int *addrlen)

nbytes(int) = recvfrom int) sockfd * char ,buf int ,nbytes int ,flags, * struct sockaddrfrom* int ,addrlen(

Comunicação via UDP

Servidor

socket ( )

bind ( )

recvfrom ( )

socket ( )

bind ( )

sendto ( )solicitação

Cliente

• Envia pacote para o endereço informado

nbytes = (int) recvfrom (int sockfd, char *buf, int nbytes, int flags, struct sockaddr *from, int *addrlen)

nbytes(int) = recvfrom int) sockfd * char ,buf int ,nbytes int ,flags, * struct sockaddrfrom* int ,addrlen(

Comunicação via UDP

Servidor

socket ( )

bind ( )

recvfrom ( )

sendto ( )

socket ( )

bind ( )

sendto ( )

recvfrom ( )

solicitação

resposta

processamento

Cliente

• Diagrama completo

close ( ) close ( )

MultiplexaçãoMultiplexação• Problema:

Servidor esperando conexão em vários sockets

Como aceitar a 1a que chegar?

MultiplexaçãoMultiplexação

• Soluções:

• Definir sockets não bloqueantes e fazer polling => busy wait• Criar um filho para cada socket• Usar I/O assíncrono (evento gera SIGIO) => programação não trivial• Função select ( )

Função select ( )

• maxfd indica o maior descritor a ser pesquisado• readfds é um vetor de bits, cada bit correspondendo a um descritor onde se espera uma entrada• writefds idem, se espera uma saída• exceptfds idem, se espera uma exceção• timeout define por quanto tempo o select espera

ret = (int) select (int maxfd, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout)

ret = (int)select int) maxfd* fd_set ,readfds* fd_set ,writefds , * fd_setexceptfds* struct timeval ,timeout(

Função select ( )Função select ( )#include <sys/time.h>#include <sys/types.h>...fd_set readfds;struct timeval wait;...for (;;) { wait.tv_sec = 1; /* ajusta timeout para 1 seg */ wait.tv_usec = 0; FD_ZERO (&readfds); /* zera vetor de bits */ FD_SET (sd1, &readfds); /* liga bit correspondente ao socket 1 */ FD_SET (sd2, &readfds); /* liga bit correspondente ao socket 2 */ nb = select (FD_SETSIZE, &readfds, (fd_set *) 0, (fd_set *) 0, &wait); if (nb <= 0) { /* ocoreu erro ou expirou o timeout */ } if (FD_ISSET (s1, &readfds)) { /* socket 1 está pronto para ser lido */ } ...

top related