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



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

Sistemas de Operação Sockets

sockets interprocess communication Taisy Weber

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

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

Comunicação entre Processos

Aula de Socket. Rafael De Tommaso do Valle

Um Tutorial sobre Sockets Parte I

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

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é

INF01018 Aula Prática 1 Cliente-Servidor e Multicast

Introdução à Programação Sockets

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

MC823 Laboratório de Teleprocessamento e Redes

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

Redes de Computadores I

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

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

Relatório do Laboratório 3

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

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

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

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

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

1 Projeto de software de clientes. 1

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

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

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

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

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

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

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

Sistemas Operacionais II

Programação com sockets (em Java)

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

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

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

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

Comunicação entre Processos

Comunicação entre processos. Sistema centralizado

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

Comunicação entre pai e filho

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

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

Programação Orientada a Objetos para Redes de Computadores

Programação TCP/IP (sockets)

Redes de Computadores

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

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

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

Tutorial de Sockets - Parte I Por: Frederico Perim

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

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

Grupo I [6 v] Considere o processo com a seguinte tabela de páginas: Página Presente Protecção Base 0 0 RW RW R R RW -

Trabalho 02: Cliente e Servidor em C

Sistemas Operacionais:

Programação em Rede Baseada em Java. Luiz Affonso Guedes Tópicos em Redes de Computadores Programação Distribuída

Modelo Cliente/Servidor e Introdução a Sockets

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

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

camada de transporte SOCKET TCP UDP

AInterface que um aplicativo utiliza quanto interage com um módulo implementado por outro software

Sockets IPv6 para C/C++ - Criando e Portando Aplicações

Redes de Computadores (PPGI/UFRJ)

TP4. Apoio ao projeto 4: tópicos avançados de sockets

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

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

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

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

Comunicação entre Processos Canal de comunicação Arquitetura da comunicação Modelos de comunicação

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.


Resolução de Nomes e Endereços

Programação de Sistemas

Por Fernando Koyanagi

Sistemas de Operação (2018/2019) Ficha 6

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

3. Projeto e implementação de Servidores

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

Programação paralela em UNIX. Aleardo Manacero Jr.

Programação em C/C++

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

Programação paralela em UNIX. Aleardo Manacero Jr.

Sockets. Bruno Guimarães Lucas Rossini

Comunicação entre Processos

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

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

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

Programação de Sockets

Sistemas Distribuídos

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

Problemas relacionados a exclusão mútua

6. Comunicação entre processos - Pipes

Comunicação entre Processos por Troca de Mensagens. Prof. Celso maciel da Costa

Comunicação entre Processos

Redes de Computadores

Tópicos em Sistemas Distribuídos. Modelos de Comunicação

Transcriçã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 baseadas em rede, 3. Suportar comunicação entre processos não relacionados residindo localmente ou remotamente, 4. Permitir a várias formas de comunicação: Comunicação internet (TCP, UDP) Comunicação na mesma máquina Comunicação Broadcast e Multicast

SOCKETS: Introdução Quando criamos um SOCKET o domínio de comunicação é especificado. Os domínios especificam o escopo da comunicação, local ou remota, e como os nomes e endereços são formados e interpretados nas chamadas subsequentes, caminhos ou endereços IP/numero de porta.. UNIX: sockets tem nome de arquivos e são usados com processos do mesmo host. Os processos cliente e servidor comunicam-se via arquivos (PIPE). ( AF_UNIX) Internet: sockets permitem que processos não relacionados de diferentes hosts comuniquem-se entre si, usando endereços como: 128.195.1.1@port 21. ( AF_INET)

SOCKETS: Introdução Os processos devem concordar com um conjunto de regras de comunicação que são determinadas por protocolos. Algumas famílias (agrupamento) de protocolos: TCP - Transmission Control Protocol IP - Internet Protocol UDP - User Datagram Protocol

SOCKETS: Introdução Tipos de sockets + comuns : stream e datagram Stream: confiáveis, dados são entregues em ordem na mesma sequencia de envio. Comunicação bidirecional, orientado a conexão. Existe uma conexão lógica entre os processos. Informações sobre a conexão estabelecida antes da transmissão. Mensagens urgentes. Datagram: não confiáveis, dados podem ser recebidos fora de ordem. Comunicação bidirecional, porém sem conexão. Cada datagrama é enviado separadamente podendo usar caminhos diferentes. Sem controle de fluxo. Controle de erro mínimo. Pacotes pequenos e de tamanho fixo.

Sockets - Orientado a Conexão SERVIDOR Associa um endereço ao socket bind ( ) CLIENTE Cria um socket Cria um socket socket ( ) socket ( ) Estabelece fila para conexões listen ( ) Extrai conexão da fila accept( ) Inicia conexão connect( ) read( ) write ( ) write ( ) read( )

Especificação de endereço para Sockets struct sockaddr : estrutura genérica para todas as famílias de protocolos struct sockaddr { u_short sa_family; char sa_data[14]; ; struct sockaddr_un : endereço para família de protocolos domínio UN #include <sys/socket.h> struct sockaddr_un { short sun_family; /*AF_UNIX*/ char sun_path[108]; ; sin_addr;

Especificação de endereço Internet struct in_addr : estrutura com um endereço Internet (4 bytes) struct in_addr { uint32_t s_addr; /* endereço IP, formato rede*/ ; struct sockaddr_in { short sin_family; /*AF_INET*/ u_short sin_port; /*porta formato rede*/ struct in_addr sin_addr; /* endereço IP*/ char sin_zero[8]; /*não usado*/ ; struct sockaddr_in : endereço para a família de protocolos internet

Socket Include <sys/types.h> <sys/socket.h> int socket( int familia, int tipo, Chamada int protocolo); sucesso falha errno retorno 0 e 1 desc. -1 sim

connect Include <sys/types.h> <sys/socket.h> Chamada int connect( int socket, struct sockaddr *nome, int *tamnome); sucesso falha errno retorno 0-1 sim

bind Include <sys/types.h> <sys/socket.h> Chamada int bind( int socket, const struct sockaddr *nome, int tamnome); sucesso falha errno retorno 0-1 sim

listen Include <sys/types.h> <sys/socket.h> Chamada int listen( int socket, int tam_fila); sucesso falha errno retorno 0-1 sim

accept Include <sys/types.h> <sys/socket.h> Chamada int accept( int socket, struct sockaddr *end, int *tamend); sucesso falha errno retorno inteiro ns -1 sim

read() / write() Include <unistd.h> ssize_t read( int fd, const void *buffer, Chamada size_t count ); ssize_t write( int fd, const void *buffer, size_t count); sucesso falha errno retorno bytes -1 sim

Exemplo Domínio UNIX (socklcli.c socklser.c) #include <unistd.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/un.h> #define NAME "my_socket" main(void) { extern int errno; int sd, /* descritor do socket */ ns,i; static char buf[256]; /* buffer de mensagens */ static struct sockaddr_un serv_sock; /* endereço UNIX para serv */ int fromlen; if (( sd = socket( AF_UNIX, SOCK_STREAM,0 )) < 0) { printf("erro na geração do socket"); exit(1);

serv_sock.sun_family = AF_UNIX; /* comunicação UNIX */ strcpy(serv_sock.sun_path, NAME); /* nome do socket */ /* conecta nome do socket */ if ( connect( sd, (struct sockaddr *) &serv_sock, sizeof(serv_sock.sun_family) +strlen(serv_sock.sun_path)) < 0) { printf("erro de conexao"); exit(1); for (i=1; i<=5; i++) { sprintf(buf, "Cliente enviando mensagem n.: %d\n",i); write( sd, buf, sizeof(buf)); printf("mensagens enviadas = %d\n",i); close(sd); exit(0);

#define NAME "my_socket" main(void) { extern int errno; int sd, /* descritor do socket */ ns,ns1, /* novo descritor */ er,i; static char buf[256]; static struct sockaddr_un sock_cli, sock_cli1, sock_ser; int fromlen, fromlen1; void clean_up (int, char *); if ((sd = socket( AF_UNIX, SOCK_STREAM,0 )) < 0) { printf("erro de geração do socket \n"); exit(1); sock_ser.sun_family = AF_UNIX; strcpy( sock_ser.sun_path, NAME ); unlink( NAME );

/* bind nome */ if ( bind( sd, (struct sockaddr *) &sock_ser, sizeof(sock_ser.sun_family) +strlen(sock_ser.sun_path)) < 0) { printf("erro de bind \n"); clean_up( sd,name ); exit(2); listen( sd,2 ); fromlen = sizeof( sock_cli ); if ((ns = accept( sd, (struct sockaddr *) &sock_cli, &fromlen)) < 0) { printf("erro na conexão \n"); clean_up(sd, NAME ); exit(3); if ((ns1 = accept( sd, (struct sockaddr *) &sock_cli1, &fromlen1)) < 0) { printf("erro na conexao 1 \n"); clean_up(sd, NAME); exit(3);

for (i=1; i<=10; i++) { sleep(1); if (( er = read(ns, buf, sizeof(buf))) <= 0 ) printf("sem mensagem \n"); else printf("s-> %s", buf); sleep(1); if ((er = read(ns1, buf, sizeof(buf))) <= 0 ) printf("sem mensagem \n"); else printf("s-> %s", buf); close(ns); close(ns1); clean_up( sd, NAME); exit(0); void clean_up( int sc, char *file ) { close (sc); unlink( file );

Exemplos : - Domínio Internet (sockrcli.c sockrser.c) Neste domínio os processos devem ter informação de endereço e porta para comunicar-se. Uma aplicação pode conhecer o nome do host (venus) mas não tem informações específicas (endereço internet, serviços oferecidos(portas), etc.). Para isto existem chamadas ao serviço de rede.

Getpeername / getsockname Include <sys/types.h> <sys/socket.h> Chamada int getpeername( int sockfd, struct sockaddr *peer, socklen_t *addrlen ); int getsockname( int sockfd, struct sockaddr *local, socklen_t *addrlen ); sucesso falha errno retorno endereço NULL sim em peer ou local

inet_pton / inet_ntop Include <sys/types.h> <sys/socket.h><netdb.h> <netinet/in.h> Chamada int inet_pton( int family, const char *stptrr, void *addrptr ); char *inet_ntop( int family, const void *addrptr, char *stptrr, size_t len ); sucesso falha errno retorno 1 0, -1 sim ponteiro NULL

Gethostbyname (gethost.c) Include <sys/types.h> <netdb.h> <sys/socket.h> <netinet/in.h> struct hostent Chamada *gethostbyname( const char *nome ); sucesso falha errno retorno referência NULL sim a hostent

#include <stdio.h> #include <sys/types.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> main(void) { struct hostent *host; static char who[10]; printf("informe o nome do host: "); scanf("%10s",who); host = gethostbyname( who ); if ( host!= (struct hostent *) NULL ) { printf("informações sobre %s :\n",who); printf("nome : %s\n", host->h_name); printf("aliases : "); while ( *host->h_aliases ) { printf("%s ", *host->h_aliases ); ++host->h_aliases;

printf("\n Tipo de endereço : %i\n", host->h_addrtype); printf("tamanho do endereço : %i\n", host->h_length); printf("lista de endereços : "); while ( *host->h_addr_list ) { struct in_addr in; memcpy( &in.s_addr, *host->h_addr_list, sizeof(in.s_addr)); printf("[%s] = %s ", *host->h_addr_list, inet_ntoa(in)); ++host->h_addr_list; printf("\n");

Getservbyname (getserv.c) Include <sys/types.h> <netdb.h> <sys/socket.h> <netinet/in.h> struct servent Chamada *getservbyname( const char *nome, char *protocolo ); sucesso falha errno retorno referência NULL a servent

#include <stdio.h> #include <sys/types.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> main(void) { struct servent *serv; static char protocol[10], service[10]; printf("informe o nome do serviço: "); scanf("%9s",service); printf("informe protocolo: "); scanf("%9s",protocol); serv = getservbyname ( service, protocol );

if ( serv!= (struct servent *) NULL ) { printf("informações que encontrei :\n"); printf("nome : %s\n", serv->s_name); printf("aliases : "); while ( *serv->s_aliases ) { printf("%s ", *serv->s_aliases ); ++serv->s_aliases; printf("\n Numero da Porta : %i\n",htons( serv- >s_port )); printf("familia de protocolo : %i\n", serv->s_proto); else printf("serviço %s para protocolo %s não encontrado\n",service,protocol);

/* servidor exemplo internet */ #include "local.h" main(void) { extern int errno; int sd, /* descritor do socket */ ns, /* novo descritor */ erro,len,i; static char buf[256]; struct sockaddr_in sock_cli, /* enderecos */ sock_ser; int fromlen; /* tamanho end. cliente */ if ((sd = socket( AF_INET, SOCK_STREAM,0 )) < 0) { printf("erro de geração do socket \n"); exit(1); memset( &sock_ser, 0, sizeof(sock_ser) ); sock_ser.sin_family = AF_INET; /* tipo */ sock_ser.sin_addr.s_addr= htonl(inaddr_any); /* interface */ sock_ser.sin_port = htons(port); /* fake port */

/* bind nome */ if ( bind( sd, (struct sockaddr *) &sock_ser, sizeof(sock_ser)) < 0) { printf("erro de bind \n"); close(sd); exit(2); if ( listen( sd,5 ) < 0 ) { printf("erro no listen \n"); exit(3); do { fromlen = sizeof(sock_cli); if ((ns = accept( sd,(struct sockaddr *) &sock_cli, &fromlen)) < 0) { printf("erro na conexão \n"); close(sd); exit(3); if ( fork() == 0 ) { /* processo filho */ while ( (len=read(ns, buf, BUFSIZ)) > 0 ) { for (i=0; i < len; ++i) buf[i] = toupper(buf[i]); write(ns, buf, len); if ( buf[0] == '.') break; close(ns); exit(0); else close(ns); /* processo pai */ while( 1 );

/* cliente implementaçao internet */ #include "local.h" main( int argc, char *argv[] ) { extern int errno; int sd, /* descritor do socket */ ns,i,len; static char buf[256]; /* buffer de mensagens */ struct sockaddr_in serv_sock; /* endereço UNIX para serv */ struct hostent *host; /* servidor */ if ( argc!= 2 ){ fprintf(stderr, "uso: %s servidor\n",argv[0]); exit(1); host = gethostbyname(argv[1]); /* informacoes servidor */ if (host == (struct hostent *) NULL ) { printf("erro no gethostbyname \n"); exit(2); memset(&serv_sock, 0, sizeof(serv_sock)); serv_sock.sin_family = AF_INET; /* tipo */

memcpy(&serv_sock.sin_addr, host->h_addr,host->h_length); serv_sock.sin_port = htons(port); /* fake port */ if (( sd = socket( AF_INET, SOCK_STREAM,0 )) < 0) { printf("erro na geração do socket"); exit(3); /* conecta nome do socket */ if ( connect( sd, (struct sockaddr *) &serv_sock, sizeof(serv_sock)) < 0) { printf("erro de conexao"); exit(4); do { write(fileno(stdout),"> ", 3); /* prompt */ if (( len=read(fileno(stdin), buf, BUFSIZ)) > 0) { write(sd, buf, len); if ((len=read(sd, buf, len)) > 0 ) write(fileno(stdout), buf, len); while (buf[0]!= '.'); close(sd); exit(0);

/* arquivo local.h */ #include <stdio.h> #include <string.h> #include <ctype.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> #define PORT 6996 static char buf[bufsiz];

Sockets - Sem Conexão SERVIDOR CLIENTE Cria um socket Cria um socket socket ( ) socket ( ) Associa um end. ao socket associa um end. ao socket bind ( ) bind ( ) Recebe dados do cliente Envia dados ao servidor recvfrom ( ) sendto ( ) Envia dados ao cliente Recebe dados do servidor sendto ( ) recvfrom( )

send, sendto e sendmsg Include <sys/uio.h> <sys/types.h> <sys/socket.h> int send( int socket, const char *msg, Chamada int tam, int flags ); int sendto( int socket, const char *msg, int tam, int flags, const struct sockaddr *to, int tam); int sendmsg( int socket, const struct msghdr *msg, int flags); sucesso falha errno retorno bytes -1 sim

recv, recvfrom e recvmsg Include <sys/uio.h> <sys/types.h> <sys/socket.h> int recv( int socket, const char *buffer, Chamada int tam, int flags ); int recvfrom( int socket, const char *buffer, int tam, int flags, const struct sockaddr *from, int tam); int recvmsg( int socket, const struct msghdr *msg, int flags); sucesso falha errno retorno bytes -1 sim

#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/un.h> #define SERVER_FILE "server_socket" main(void) { extern int errno; int sd, /* descritor do socket */ ns,ns1, /* novo descritor */ er,i; static char buf[40]; static struct sockaddr_un sock_cli,sock_ser; int fromlen; void clean_up (int, char *); if ((sd = socket( AF_UNIX, SOCK_DGRAM,0 )) < 0) { printf("erro de geração do socket \n"); exit(1); sock_ser.sun_family = AF_UNIX; strcpy( sock_ser.sun_path, SERVER_FILE ); unlink( SERVER_FILE );

/* bind nome */ if ( bind( sd, (struct sockaddr *) &sock_ser, sizeof(sock_ser.sun_family)+strlen(sock_ser.sun_path)) < 0) { printf("erro de bind \n"); clean_up( sd,server_file ); exit(2); for (i=1; i<=10; i++) { recvfrom(sd, buf, sizeof(buf), 0, (struct sockaddr *) &sock_cli, &fromlen); printf("s-> %s ",buf); clean_up( sd, SERVER_FILE); exit(0); void clean_up( int sc, char *file ) { close (sc); unlink( file );

#define SERVER_FILE "server_socket" main(void) { extern int errno; int sd, /* descritor do socket */ ns,i; static char buf[40], /* buffer de mensagens */ client_file[15]; static struct sockaddr_un serv_sock, /* endereço UNIX para serv */ clit_sock; int fromlen; void clean_up( int, char * ); serv_sock.sun_family = AF_UNIX; /* comunicação UNIX */ strcpy(serv_sock.sun_path, SERVER_FILE); /* nome do socket */ if (( sd = socket( AF_UNIX, SOCK_DGRAM,0 )) < 0) { printf("erro na geração do socket"); exit(1);

sprintf(client_file,"%07d_socket",getpid()); clit_sock.sun_family = AF_UNIX; /* comunicação UNIX */ strcpy(clit_sock.sun_path, client_file); /* nome do socket */ /* bind socket */ if ( bind( sd, (struct sockaddr *) &clit_sock, sizeof(clit_sock.sun_family)+strlen(clit_sock.sun_path)) < 0){ printf("erro de bind"); exit(2); for (i=1; i<=10; i++) { sleep(1); sprintf(buf, "Cliente enviando mensagem n.: %d\n",i); sendto( sd, buf, sizeof(buf), 0, (struct sockaddr *) &serv_sock, sizeof(struct sockaddr)); printf("mensagens enviadas = %d\n",i); close(sd); exit(0);

/* servidor exemplo internet/datagrama */ #include "local.h" main(void) { extern int errno; int sd, /* descritor do socket */ ns, /* novo descritor */ erro,i; struct sockaddr_in sock_cli, /* enderecos */ sock_ser; int server_len, client_len; /* tamanho end. cliente */ if ((sd = socket( AF_INET, SOCK_DGRAM,0 )) < 0) { printf("servidor: erro de geração do socket \n"); exit(1); sock_ser.sin_family = AF_INET; /* tipo */ sock_ser.sin_addr.s_addr= htonl(inaddr_any); /* interface */ sock_ser.sin_port = htons(0); /* fake port */ /* bind nome */ if ( bind( sd, (struct sockaddr *) &sock_ser, sizeof(sock_ser)) < 0) { printf("servidor: erro de bind \n"); exit(2);

if ( getsockname(sd, (struct sockaddr *) & sock_ser, &server_len ) < 0) { printf("servidor: erro no getsocketname \n"); exit(3); printf("servidor usando porta %d\n",ntohs(sock_ser.sin_port)); while(1){ client_len = sizeof(sock_cli); memset(buf,0,bufsiz); if ((i=recvfrom(sd, buf, BUFSIZ,0, (struct sockaddr *) &sock_cli, &client_len)) < 0) { printf("servidor: erro de recvfrom \n"); close(sd); exit(4); write(fileno(stdout),buf,i); memset(buf,0,bufsiz); write(fileno(stdout),"> ",3); if (fgets(buf,bufsiz,stdin)!= NULL) { if ((sendto(sd,buf,strlen(buf),0, (struct sockaddr *) &sock_cli, client_len)) < 0) { printf("servidor: erro sendto\n"); close(sd); exit(5);