Vous êtes sur la page 1sur 8

Programao

1. Funes de E/S com Arquivo:


Para estas funes, necessrio incluir a biblioteca: #include <stdio.h> Para manipular um arquivo atravs das funes, necessrio criar um ponteiro de arquivo que um ponteiro para informaes que definem nome, status e posio atual do arquivo, entre outras. O comando a seguir cria este ponteiro: FILE *fp; Seguem as operaes mais comuns com arquivos. 1.1 Abrir um arquivo: A funo fopen() abre um arquivo e retorna o ponteiro de arquivo associado a ele. Os argumentos da funo so os seguintes: FILE fopen(const char* nomearq, const char* modo); Nomearq o nome ou o caminho do arquivo que deve ser fornecido diretamente entre aspas ou sob a forma de uma varivel string que o contenha. Modo determina como o arquivo ser aberto, segundo a tabela a seguir: Modo r w a rb wb ab r+ w+ a+ r+b w+b a+b Significado Abre um arquivo-texto para leitura Cria um arquivo-texto para escrita Anexa a um arquivo-texto j existente Abre um arquivo binrio para leitura Cria um arquivo binrio para escrita Anexa a um arquivo binrio j existente Abre um arquivo-texto para leitura/escrita Cria um arquivo-texto para leitura/escrita Anexa ou cria um arquivo-texto para leitura/escrita Abre um arquivo binrio para leitura/escrita Cria um arquivo binrio para leitura/escrita Anexa a um arquivo binrio para leitura/escrita Um exemplo, incluindo um mtodo para detectar erro na abertura dado: FILE *fp; if ((fp = fopen(test.txt, w)) == NULL){

printf(arquivo no pode ser aberto\n); exit(1); } 1.2 Fechar um Arquivo: A funo fclose() fecha um arquivo que foi aberto atravs da funo fopen(). Ela retorna zero se a operao foi bem sucedida e outro valor se ocorreu algum erro. Sua forma a seguinte: int fclose(FILE *fp); fp o ponteiro de arquivo do arquivo anteriormente aberto. 1.3 Ler de um Arquivo: A funo fread() permite a leitura de blocos de qualquer tipo de dados. Ela retorna o nmero de blocos efetivamente lidos. Sua forma dada: size_t fread(void *buffer, size_t num_bytes, size_t count, FILE *fp); O tipo size_t o mesmo que unsigned int. O primeiro argumento o endereo da varivel para onde os dados sero lidos, num_bytes o nmero de bytes a ser lido, count quantos blocos de tamanho num_bytes sero lidos e fp o ponteiro de arquivo relacionado ao arquivo a ser lido. Aps executada essa funo, a posio do ponto de insero no final do ltimo bloco lido. Ex: fread (&d, sizeof(int), 1, fp); 1.4 Escrever em um Arquivo: A funo fwrite() permite a escrita de blocos de qualquer tipo de dados em um arquivo. Ela retorna o nmero de blocos efetivamente escritos. Seus argumentos so anlogos funo de leitura: size_t fwrite(void *buffer, size_t num_bytes, size_t count, FILE *fp); A diferena que, neste caso, o primeiro argumento o endereo da varivel onde se encontram os dados a serem escritos. Com esta funo, a posio do ponto de insero tambm a do final do ltimo bloco escrito. 1.5 Fim de Arquivo: A funo feof() permite verificar se o fim do arquivo foi atingido. Ela devolve verdadeiro, ou seja, um valor no nulo, se o fim do arquivo foi atingido e, 0 caso contrrio.

int feof(FILE *fp);

2. Interface Socket:
Um socket uma interface de programao de aplicao (API), que fornece a sintaxe atravs da qual os servios oferecidos por um protocolo podem ser chamados em um Sistema Operacional. Na programao das interfaces socket, o modelo utilizado o cliente-servidor. Neste modelo, o servidor faz uma abertura passiva, esperando conexes de um cliente, e o cliente faz a abertura ativa da conexo. A abertura passiva consiste na criao de um socket e na preparao do servidor para uma conexo, sem efetivamente estabelec-la. A porta usada pelo servidor deve ter um nmero conhecido para que o cliente saiba onde tentar a conexo. As informaes necessrias so fornecidas atravs de uma estrutura de endereamento. Depois de criado o socket, ele deve ser associado a uma porta TCP ou UDP, o que feito pela funo bind(). A partir deste ponto, dependendo se usado TCP ou UDP como protocolo de transporte, a seqncia de funes difere. O UDP, por ser um protocolo no-orientado conexo, como o prprio nome diz, no estabelece uma conexo antes de enviar os dados: quando a aplicao tem informao a transmitir, ela simplesmente a envia. Logo, o programa UDP s far uso das funes recvfrom() e sendto() (que anexa um cabealho contendo o endereo IP do destino e o nmero da porta aos dados). O TCP um protocolo orientado conexo e precisa de outras funes para estabelecer a mesma. Aps o socket ter sido associado a uma porta pela funo bind(), o processo continua da seguinte maneira. Um servidor pode aceitar mais de uma conexo simultaneamente. Para isso, necessrio que se crie uma fila de conexes pendentes, onde se define o mximo de conexes ainda no tratadas pelo servidor. A funo listen() tem este papel. Finalizada essa seqncia, o servidor chama a funo accept(). Ela fica bloqueada at que um cliente tente uma conexo, quando ento um novo socket criado para atendla. Com isso, o primeiro socket ainda existe e continua responsvel pela abertura passiva, sendo usado em futuras chamadas de accept(). Assim, foi estabelecida uma conexo full-duplex entre cliente e servidor e a transferncia de dados pode comear, utilizando-se as funes send() e recv(). O lado do cliente ainda mais simples. Tambm criado um socket, mas no necessrio associ-lo a uma porta especfica, deixando essa escolha a cargo do sistema operacional. Feito isso, ele chama a funo connect() que pede uma conexo na porta conhecida do servidor. Essa funo inicia a apresentao de 3 vias do TCP e s retorna quando a conexo for estabelecida ou se um erro ocorrer. Terminada a comunicao entre cliente e servidor, os sockets podem ser fechados. Para usar estas funes, devem ser includas as seguintes bibliotecas: #include #include #include #include <sys/types.h> <sys/socket.h> <netinet/in.h> <netdb.h>

O modelo acima descrito est representado nas figuras abaixo e as funes com seus argumentos e valores de retorno so apresentados em seguida.

OBS: As funes read() e write() so substitudas por recv() e send(), respectivamente.

o Criao do socket Funo socket() int socket(int family, int type, int protocol); O primeiro argumento indica a famlia de protocolos que ser utilizada. Neste caso, a famlia da Internet usa o valor PF_INET. O segundo argumento define o tipo de socket a ser criado. O TCP orientado a cadeias de bytes e portanto seu valor SOCK_STREAM. O UDP orientado a datagramas e assim seu valor SOCK_DGRAM. O ltimo argumento identifica o protocolo especfico a ser usado. Neste caso ser nulo, j que os dois primeiros argumentos j identificam exclusivamente o protocolo. Caso bem sucedida, a funo retorna um inteiro similar a um descritor de arquivos relacionado ao socket criado, atravs do qual ele pode ser referenciado. Caso contrrio, devolve um valor negativo. o Associao do socket a uma porta Funo bind() int addr_len); bind(int socket, struct sockaddr *address, int

O primeiro argumento o socket criado pela funo socket(). O segundo a estrutura de endereamento que contm as informaes necessrias para o estabelecimento da conexo. O ltimo o tamanho dessa estrutura, pois, dependendo da famlia e do protocolo utilizados, ele varia.

Esta funo retorna um valor no nulo em caso de sucesso. o Fila de Conexes Pendentes Funo listen() int listen(int socket, int backlog); O ltimo argumento um inteiro que define o tamanho da fila. A funo retorna um valor no nulo em caso de sucesso. o Estabelecimento da Conexo Funo accept() int accept(int socket, struct sockaddr *address, int *addr_len); O segundo e o terceiro argumentos so usados para retornar a estrutura de endereamento do cliente ao qual foi estabelecida uma conexo, da ser passado um endereo e no um valor de varivel. A funo retorna um inteiro similar a um descritor de arquivo, que um clone do socket inicial, referente a esta conexo recm-criada. Esse novo socket criado pela funo accept() ser fechado quando esta conexo for finalizada. o Conexo Funo connect() int connect(int socket, struct sockaddr *address, int addr_len); Os argumentos so anlogos, porm aqui o valor do tamanho da estrutura de endereamento que passado funo. A funo retorna um valor no nulo em caso de sucesso. o Envio de mensagens usando TCP Funo send() int send(int socket, char *message, int msg_len, int flags); O segundo argumento o endereo da varivel onde se encontra a mensagem que se deseja transmitir pelo socket indicado no primeiro parmetro, seguido do tamanho dessa mensagem e de um conjunto de flags que controlam certos detalhes da operao mas que podem receber um valor nulo. o Recepo de mensagens usando TCP Funo recv() int recv(int int flags); socket, char *buffer, int buffer_len,

Os argumentos so anlogos funo send(), sendo que agora o segundo argumento o endereo da varivel onde a mensagem recebida ser armazenada.

o Envio de mensagens usando UDP Funo sendto() ssize_t sendto(int socket, char *message, int msg_len, int flags, struct sockaddr *address, int addr_len); Todos os argumentos tm os mesmos significados anteriores e flags continua podendo ser nulo. A funo retorna o nmero de bytes enviados ou 1, em caso de erro. o Recepo de mensagens usando UDP Funo recvfrom() ssize_t recvfrom(int socket, char *buffer, buffer_len, int flags, struct sockaddr *address, *addr_len); int int

Todos os argumentos tm os mesmos significados anteriores. A funo retorna, alm do datagrama recebido (no segundo argumento), a estrutura de endereamento da origem de forma que o destino possa enviar-lhe uma resposta (quinto argumento) e o nmero de bytes da rea de dados recebidos ou 1 em caso de erro. o Fechando o socket Funo close() int close(int socket); A funo retorna um valor nulo em caso de sucesso. o Estrutura de endereamento struct sockaddr_in{ short int sin_family; unsigned short int sin_port; struct in_addr sin_addr; unsigned char sin_zero[8]; } O primeiro item da estrutura define o tipo de famlia do protocolo a ser usado. Deve ser atribudo o valor AF_INET que indica a famlia de protocolos da Internet. Em seguida, vem o nmero da porta TCP ou UDP usada na comunicao entre os processos. Para se atribuir o valor a este item, necessrio usar uma funo que transforma a representao de dados do host na representao de dados da rede. Um exemplo seria sin.sin_port = htons (SERVER_PORT); onde SERVER_PORT o nmero da porta a ser utilizada. Foi criada uma representao de dados para a rede, porque cada host armazena os bytes em uma determinada ordem, o que poderia gerar confuso na interpretao dos dados recebidos.

O prximo item o endereo IP do host de destino. Ele pode ser fornecido de maneira direta ou por uma entrada de dados. No caso do servidor, utiliza-se a constante INADDR_ANY que, por no especificar um endereo IP, permite que o servidor aceite conexes de qualquer host. Como esta estrutura de endereamento serve para qualquer tipo de protocolo, os endereos podem ter tamanhos diferentes dependendo da famlia. Por isso, sin_zero existe para zerar a parte da estrutura que no foi usada, j que alocado espao para o maior tamanho de endereo possvel.

3. Referncias:
C Completo e Total Herbert Schildt Makron Books 3 edio (referncias sobre programao em C) Computer Networks A System Approach Larry Peterson & Bruce Davie Morgan Kauffman 2 edio (exemplo de um programa cliente e de um programa servidor usando TCP Captulo 1 Pasta 635 na Xerox da ngela) Unix Network Programming Richard Stevens Prentice Hall 2 edio Volume 1 (referncias sobre programao de interfaces socket)

Vous aimerez peut-être aussi