Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* Servidor que permite consultar paginas de texto remotamente.
- As paginas serao visualizadas a partir do programa cliente que
- implementa as seguintes funcionalidades:
- - envio do nome do ficheiro a visualizar
- - impressao no ecran do conteudo do ficheiro */
- // Apple Xcode
- // paulogp
- //
- // servidor
- #include <stdio.h>
- #include <stdlib.h>
- #include <netinet/in.h> // struct sockaddr_in
- #include <string.h> // bzero
- #include <signal.h>
- #define BUFSIZE 20
- void atende(int ns);
- void copy_stream(FILE *src, FILE *dest);
- int main (int argc, const char * argv[])
- {
- int ns, s;
- struct sockaddr_in serv_addr;
- // para nao terminar caso a ligacao com o cliente seja interrompida
- // durante a transmissao do ficheiro: ignorar o sinal SIG_PIPE
- // caso se queira terminar: basta comentar as seguinte 5 linhas
- struct sigaction act;
- act.sa_handler = SIG_IGN;
- act.sa_flags = 0;
- sigemptyset(&(act.sa_mask));
- sigaction(SIGPIPE, &act, NULL);
- //
- s = socket(PF_INET, SOCK_STREAM, 0);
- if (s < 0) // para o caso do sistema ja nao conseguir criar mais sockets
- {
- perror("socket");
- exit(1);
- }
- bzero((char *) &serv_addr, sizeof(serv_addr));
- serv_addr.sin_family = AF_INET;
- serv_addr.sin_addr.s_addr = INADDR_ANY;
- serv_addr.sin_port = htons(4000);
- if (bind(s, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
- {
- // o porto pode estar em uso noutro processo
- perror("bind");
- exit(1);
- }
- if (listen(s, 5) < 0)
- {
- // o porto pode estar em uso noutro processo
- perror("socket");
- }
- printf("servidor activo\n");
- while (1)
- {
- ns = accept(s, NULL, NULL);
- if (ns < 0) // para o caso de receber algum sinal (e.g., SIGSTOP/SIGCONT)
- {
- perror("accept");
- continue;
- }
- atende(ns);
- }
- return 0;
- }
- void atende (int ns)
- {
- char buf[BUFSIZE];
- int i;
- FILE *fps, *fpf;
- fps = fdopen(ns, "r+");
- // ler nome do ficheiro - sequencia de caracteres terminados com '\0'
- for (i = 0; (i < BUFSIZE) && ((buf[i] = fgetc(fps)) != 0); ++i);
- if (buf[i] != 0)
- {
- fprintf(fps, "erro na leitora do nome do ficheiro\n");
- fclose(fps);
- return;
- }
- fpf = fopen(buf, "r");
- if (fpf == NULL)
- {
- fprintf(fps, "erro na abertura do ficheiro %s\n", buf);
- fclose(fps);
- return;
- }
- // ler e enviar ficheiro
- copy_stream(fpf, fps);
- fclose(fpf);
- fclose(fps);
- }
- void copy_stream(FILE *src, FILE *dest)
- {
- int ch;
- while ((ch = fgetc(src)) != EOF)
- {
- fputc(ch, dest);
- }
- }
- //
- // cliente
- #include <stdio.h>
- #include <unistd.h>
- #include <sys/socket.h>
- #include <sys/types.h>
- #include <netinet/in.h> // struct sockaddr_in
- #include <netdb.h> // gethostbyname
- #include <string.h>
- #define BUFSIZE 20
- void formata_string(char *buf, unsigned long *ssize);
- void copy_stream(FILE *src, FILE *dest);
- int main (int argc, const char * argv[])
- {
- argv[1] = "localhost"; // para teste
- char buf[BUFSIZE];
- int s;
- unsigned long ssize;
- struct sockaddr_in name;
- struct hostent* hostinfo;
- name.sin_family = AF_INET;
- hostinfo = gethostbyname(argv[1]);
- name.sin_addr = *((struct in_addr *) hostinfo->h_addr);
- name.sin_port = htons(4000);
- while (1)
- {
- printf("nome do ficheiro: ");
- fflush(stdout);
- fgets(buf, BUFSIZE, stdin);
- formata_string(buf, &ssize);
- s = socket(PF_INET, SOCK_STREAM, 0);
- connect(s, (struct sockaddr *) &name, sizeof(struct sockaddr_in));
- write(s, buf, ssize); // envia-me nome, incluindo o '\0'
- FILE *fps = fdopen(s, "r");
- copy_stream(fps, stdout);
- fclose(fps);
- }
- return 0;
- }
- void copy_stream(FILE *src, FILE *dest)
- {
- int ch;
- while ((ch = fgetc(src)) != EOF)
- {
- fputc(ch, dest);
- }
- }
- void formata_string(char *buf, unsigned long *ssize)
- {
- *ssize = strlen(buf);
- if (buf[*ssize - 1] == '\n') // vamos eliminar o '\n', caso exista
- {
- buf[*ssize - 1] = '\0'; // '\n' substituido pelo "novo" '\0'
- }
- else // caso nao exista, aumentamos ssize, para contar o '\0' original
- {
- (*ssize)++; // so acontece quando nº de chars antes do '\n' e BUFSIZE-1
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement