1. Funções de E/S cm Arquiv: Prgramaçã Para estas funções, é necessári incluir a bibliteca: #include <stdi.h> Para manipular um arquiv através das funções, é necessári criar um pnteir de arquiv que é um pnteir para infrmações que definem nme, status e psiçã atual d arquiv, entre utras. O cmand a seguir cria este pnteir: FILE *fp; Seguem as perações mais cmuns cm arquivs. 1.1 Abrir um arquiv: A funçã fpen() abre um arquiv e retrna pnteir de arquiv assciad a ele. Os arguments da funçã sã s seguintes: FILE fpen(cnst char* nmearq, cnst char* md); Nmearq é nme u caminh d arquiv que deve ser frnecid diretamente entre aspas u sb a frma de uma variável string que cntenha. Md determina cm arquiv será abert, segund a tabela a seguir: Md Significad r Abre um arquiv-text para leitura w Cria um arquiv-text para escrita a Anexa a um arquiv-text já existente rb Abre um arquiv binári para leitura wb Cria um arquiv binári para escrita ab Anexa a um arquiv binári já existente r+ Abre um arquiv-text para leitura/escrita w+ Cria um arquiv-text para leitura/escrita a+ Anexa u cria um arquiv-text para leitura/escrita r+b Abre um arquiv binári para leitura/escrita w+b Cria um arquiv binári para leitura/escrita a+b Anexa a um arquiv binári para leitura/escrita Um exempl, incluind um métd para detectar err na abertura é dad: FILE *fp; if ((fp = fpen( test.txt, w )) == NULL){
} printf( arquiv nã pde ser abert\n ); exit(1); 1.2 Fechar um Arquiv: A funçã fclse() fecha um arquiv que fi abert através da funçã fpen(). Ela retrna zer se a peraçã fi bem sucedida e utr valr se crreu algum err. Sua frma é a seguinte: int fclse(file *fp); fp é pnteir de arquiv d arquiv anterirmente abert. 1.3 Ler de um Arquiv: A funçã fread() permite a leitura de blcs de qualquer tip de dads. Ela retrna númer de blcs efetivamente lids. Sua frma é dada: size_t fread(vid *buffer, size_t num_bytes, size_t cunt, FILE *fp); O tip size_t é mesm que unsigned int. O primeir argument é endereç da variável para nde s dads serã lids, num_bytes é númer de bytes a ser lid, cunt é quants blcs de tamanh num_bytes serã lids e fp é pnteir de arquiv relacinad a arquiv a ser lid. Após executada essa funçã, a psiçã d pnt de inserçã é n final d últim blc lid. Ex: fread (&d, sizef(int), 1, fp); 1.4 Escrever em um Arquiv: A funçã fwrite() permite a escrita de blcs de qualquer tip de dads em um arquiv. Ela retrna númer de blcs efetivamente escrits. Seus arguments sã análgs à funçã de leitura: size_t fwrite(vid *buffer, size_t num_bytes, size_t cunt, FILE *fp); A diferença é que, neste cas, primeir argument é endereç da variável nde se encntram s dads a serem escrits. Cm esta funçã, a psiçã d pnt de inserçã também é a d final d últim blc escrit. 1.5 Fim de Arquiv: A funçã fef() permite verificar se fim d arquiv fi atingid. Ela devlve verdadeir, u seja, um valr nã nul, se fim d arquiv fi atingid e, 0 cas cntrári.
int fef(file *fp); 2. Interface Scket: Um scket é uma interface de prgramaçã de aplicaçã (API), que frnece a sintaxe através da qual s serviçs ferecids pr um prtcl pdem ser chamads em um Sistema Operacinal. Na prgramaçã das interfaces scket, mdel utilizad é cliente-servidr. Neste mdel, servidr faz uma abertura passiva, esperand cnexões de um cliente, e cliente faz a abertura ativa da cnexã. A abertura passiva cnsiste na criaçã de um scket e na preparaçã d servidr para uma cnexã, sem efetivamente estabelecê-la. A prta usada pel servidr deve ter um númer cnhecid para que cliente saiba nde tentar a cnexã. As infrmações necessárias sã frnecidas através de uma estrutura de endereçament. Depis de criad scket, ele deve ser assciad a uma prta TCP u UDP, que é feit pela funçã bind(). A partir deste pnt, dependend se é usad TCP u UDP cm prtcl de transprte, a seqüência de funções difere. O UDP, pr ser um prtcl nã-rientad à cnexã, cm própri nme diz, nã estabelece uma cnexã antes de enviar s dads: quand a aplicaçã tem infrmaçã a transmitir, ela simplesmente a envia. Lg, prgrama UDP só fará us das funções recvfrm() e sendt() (que anexa um cabeçalh cntend endereç IP d destin e númer da prta as dads). O TCP é um prtcl rientad à cnexã e precisa de utras funções para estabelecer a mesma. Após scket ter sid assciad a uma prta pela funçã bind(), prcess cntinua da seguinte maneira. Um servidr pde aceitar mais de uma cnexã simultaneamente. Para iss, é necessári que se crie uma fila de cnexões pendentes, nde se define máxim de cnexões ainda nã tratadas pel servidr. A funçã listen() tem este papel. Finalizada essa seqüência, servidr chama a funçã accept(). Ela fica blqueada até que um cliente tente uma cnexã, quand entã um nv scket é criad para atendêla. Cm iss, primeir scket ainda existe e cntinua respnsável pela abertura passiva, send usad em futuras chamadas de accept(). Assim, fi estabelecida uma cnexã full-duplex entre cliente e servidr e a transferência de dads pde cmeçar, utilizand-se as funções send() e recv(). O lad d cliente é ainda mais simples. Também é criad um scket, mas nã é necessári assciá-l a uma prta específica, deixand essa esclha a carg d sistema peracinal. Feit iss, ele chama a funçã cnnect() que pede uma cnexã na prta cnhecida d servidr. Essa funçã inicia a apresentaçã de 3 vias d TCP e só retrna quand a cnexã fr estabelecida u se um err crrer. Terminada a cmunicaçã entre cliente e servidr, s sckets pdem ser fechads. Para usar estas funções, devem ser incluídas as seguintes biblitecas: #include <sys/types.h> #include <sys/scket.h> #include <netinet/in.h> #include <netdb.h>
O mdel acima descrit está representad nas figuras abaix e as funções cm seus arguments e valres de retrn sã apresentads em seguida. OBS: As funções read() e write() sã substituídas pr recv() e send(), respectivamente.
Criaçã d scket Funçã scket() int scket(int family, int type, int prtcl); O primeir argument indica a família de prtcls que será utilizada. Neste cas, a família da Internet usa valr PF_INET. O segund argument define tip de scket a ser criad. O TCP é rientad a cadeias de bytes e prtant seu valr é SOCK_STREAM. O UDP é rientad a datagramas e assim seu valr é SOCK_DGRAM. O últim argument identifica prtcl específic a ser usad. Neste cas será nul, já que s dis primeirs arguments já identificam exclusivamente prtcl. Cas bem sucedida, a funçã retrna um inteir similar a um descritr de arquivs relacinad a scket criad, através d qual ele pde ser referenciad. Cas cntrári, devlve um valr negativ. Assciaçã d scket a uma prta Funçã bind() int bind(int scket, struct sckaddr *address, int addr_len); O primeir argument é scket criad pela funçã scket(). O segund é a estrutura de endereçament que cntém as infrmações necessárias para estabeleciment da cnexã. O últim é tamanh dessa estrutura, pis, dependend da família e d prtcl utilizads, ele varia.
Esta funçã retrna um valr nã nul em cas de sucess. Fila de Cnexões Pendentes Funçã listen() int listen(int scket, int backlg); O últim argument é um inteir que define tamanh da fila. A funçã retrna um valr nã nul em cas de sucess. Estabeleciment da Cnexã Funçã accept() int accept(int scket, struct sckaddr *address, int *addr_len); O segund e terceir arguments sã usads para retrnar a estrutura de endereçament d cliente a qual fi estabelecida uma cnexã, daí ser passad um endereç e nã um valr de variável. A funçã retrna um inteir similar a um descritr de arquiv, que é um clne d scket inicial, referente a esta cnexã recém-criada. Esse nv scket criad pela funçã accept() será fechad quand esta cnexã fr finalizada. Cnexã Funçã cnnect() int cnnect(int scket, struct sckaddr *address, int addr_len); Os arguments sã análgs, prém aqui é valr d tamanh da estrutura de endereçament que é passad à funçã. A funçã retrna um valr nã nul em cas de sucess. Envi de mensagens usand TCP Funçã send() int send(int scket, char *message, int msg_len, int flags); O segund argument é endereç da variável nde se encntra a mensagem que se deseja transmitir pel scket indicad n primeir parâmetr, seguid d tamanh dessa mensagem e de um cnjunt de flags que cntrlam certs detalhes da peraçã mas que pdem receber um valr nul. Recepçã de mensagens usand TCP Funçã recv() int recv(int scket, char *buffer, int buffer_len, int flags); Os arguments sã análgs à funçã send(), send que agra segund argument é endereç da variável nde a mensagem recebida será armazenada.
Envi de mensagens usand UDP Funçã sendt() ssize_t sendt(int scket, char *message, int msg_len, int flags, struct sckaddr *address, int addr_len); Tds s arguments têm s mesms significads anterires e flags cntinua pdend ser nul. A funçã retrna númer de bytes enviads u 1, em cas de err. Recepçã de mensagens usand UDP Funçã recvfrm() ssize_t recvfrm(int scket, char *buffer, int buffer_len, int flags, struct sckaddr *address, int *addr_len); Tds s arguments têm s mesms significads anterires. A funçã retrna, além d datagrama recebid (n segund argument), a estrutura de endereçament da rigem de frma que destin pssa enviar-lhe uma respsta (quint argument) e númer de bytes da área de dads recebids u 1 em cas de err. Fechand scket Funçã clse() int clse(int scket); A funçã retrna um valr nul em cas de sucess. Estrutura de endereçament struct sckaddr_in{ shrt int sin_family; unsigned shrt int sin_prt; struct in_addr sin_addr; unsigned char sin_zer[8]; } O primeir item da estrutura define tip de família d prtcl a ser usad. Deve ser atribuíd valr AF_INET que indica a família de prtcls da Internet. Em seguida, vem númer da prta TCP u UDP usada na cmunicaçã entre s prcesss. Para se atribuir valr a este item, é necessári usar uma funçã que transfrma a representaçã de dads d hst na representaçã de dads da rede. Um exempl seria sin.sin_prt = htns (SERVER_PORT); nde SERVER_PORT é númer da prta a ser utilizada. Fi criada uma representaçã de dads para a rede, prque cada hst armazena s bytes em uma determinada rdem, que pderia gerar cnfusã na interpretaçã ds dads recebids.
O próxim item é endereç IP d hst de destin. Ele pde ser frnecid de maneira direta u pr uma entrada de dads. N cas d servidr, utiliza-se a cnstante INADDR_ANY que, pr nã especificar um endereç IP, permite que servidr aceite cnexões de qualquer hst. Cm esta estrutura de endereçament serve para qualquer tip de prtcl, s endereçs pdem ter tamanhs diferentes dependend da família. Pr iss, sin_zer existe para zerar a parte da estrutura que nã fi usada, já que é alcad espaç para mair tamanh de endereç pssível. 3. Referências: C Cmplet e Ttal Herbert Schildt Makrn Bks 3ª ediçã (referências sbre prgramaçã em C) Cmputer Netwrks A System Apprach Larry Petersn & Bruce Davie Mrgan Kauffman 2ª ediçã (exempl de um prgrama cliente e de um prgrama servidr usand TCP Capítul 1 Pasta 635 na Xerx da Ângela) Unix Netwrk Prgramming Richard Stevens Prentice Hall 2ª ediçã Vlume 1 (referências sbre prgramaçã de interfaces scket)