Servidor de arquivos (Cliente/servidor)

Publicado por Vanderson Lucio Rodrigues 12/12/2005

[ Hits: 11.308 ]

Homepage: http://www.vandersongold.com.br

Download server.c




Este programa implementa Servidor de arquivos que faz um Upload de
arquivos usando algumas chamadas de sockets.

Ps.: Você pode encontrar um  Cliente  para este servidor em " " "http://www.vivaolinux.com.br/contribuir/scripts/verScript.php?codigo=1521 ", feito em Python.
  

  



Esconder código-fonte

/* @file   
 *         --> Servidor <--
 *
 *    
 * Este programa implementa Servidor de arquivos que faz um Upload de
 * arquivos usando algumas chamadas de sockets.
 * 
 * 
 * $Revision: 1.10 $  $Date: 2005/11/21 19:24:22 $
 * 
 * (C) Copyright 2005 Vanderson Rodrigues
 * 
 */

#include <getopt.h>
#include <time.h>
#include <sys/utsname.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h> 

#include <sys/types.h>
#include <sys/fcntl.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>

#define BUF_SIZE 4096
#define QUEUE_SIZE 10
#define FILE_MODE 0664

void sistema(void)
{
   struct utsname u;
   uname(&u);

   printf("Sistema Operacional :  %s - Release %s\n", u.sysname, u.release);
   printf("Servidor: Rodando em %s\n", u.nodename);
}


void limpar(void)
{
   printf("{FONTE}33[2J"); /* limpa a tela */
   printf("{FONTE}33[1H"); /* poe o curso no topo */
}


void fatal(char *string)
{
  printf("%s", string);
  exit(EXIT_FAILURE);
}


void uso (char *prognome)
{
   printf("Uso: %s  [-p porta] [-h]\n", prognome);
   printf("\t porta - Porta TCP\n");
   printf("\t h - Mostra Essa ajuda\n");
   exit(EXIT_SUCCESS);
}


int main(int argc, char **argv)
{
   int  s, b, l, fd, sa, bytes, on = 1;
   char buf[BUF_SIZE];         /* buffer para saida do arquivo */
   struct sockaddr_in local;      /* Pega Endereco IP */
   struct sockaddr_in remoto;      /* Pega Endereco IP */
   int sin_size, optch, porta;
   char *client_ip, stropts[] = "hp:";
   char arq_nome[256], arq_tamanho[256];
   time_t time1, time2;
         
   while ((optch = getopt(argc, argv, stropts)) != EOF) {
      switch (optch) {
         case 'h':
            uso(argv[0]);
            return 0;
         case 'p':
            porta = atoi(optarg);
            break;
         default:
            fprintf(stderr, "digite -h para ajuda\n");
            exit(EXIT_FAILURE);
      }
   }

   if ( argc != 3) {
      fprintf(stderr,"Erro: Faltando  Argumentos.\n");
      fputs("Use -h para  ajuda.\n",stderr);
      exit(EXIT_FAILURE);
   }

   /* Constroi a estrutura de endereco pra amarrar com Servidor. */
   memset(&local, 0, sizeof(local));   /* zera local */
   local.sin_family = AF_INET;
   local.sin_addr.s_addr = htonl(INADDR_ANY);
   local.sin_port = htons(porta);

   /* Cria socket */
   if ((s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0 )
      fatal("Falha ao Cria Socket\n");

   /* diz pra aceitar mais de uma conexao */
   setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *) &on, sizeof(on));

   if ((b = bind(s, (struct sockaddr *) &local, sizeof(local))) < 0)
      fatal("Bind Falhou\n");

   /* Especifica o tamanho da fila */
   if ((l = listen(s, QUEUE_SIZE)) < 0)
      fatal("listen failed");

   limpar(); 
   sistema();

   /* Loop principal. Esperando por conexao */
   while (1) {
      printf("Servidor: Aguardando Conexao.\n");
      sin_size = sizeof(struct sockaddr_in);

      /* bloco para aceitar a requisicaoi */
      if ((sa = accept(s,( struct sockaddr *)&remoto, &sin_size)) < 0)
         fatal("Falha no accept\n");

      time(&time1);

      client_ip = inet_ntoa(remoto.sin_addr);

      printf(">>> Servidor: Conectado a  %s  Porta: %d\n", client_ip, remoto.sin_port);

      /* Recebe e imprime na tela o nome do Arquivo */
      if ((bytes = recv(sa, buf, 256, 0)) < 0)
         fprintf(stderr, "Falha no recebimento de dados\n");
      buf[bytes] = '{FONTE}';
      strcpy(arq_nome, buf);
      printf(">>> Recebendo Arquivo: ");
      printf("\"%s\"  -->  ", buf);

      /* zera buf */
      bzero(buf, BUF_SIZE);

      /* Recebe  e imprime o tamanho do Arquivo */
      if ((bytes = recv(sa, buf, 256, 0)) < 0)
         fprintf(stderr, "Falha no recebimento de dados\n");
      buf[bytes] = '{FONTE}';
      strcpy(arq_tamanho, buf);
      printf("%sK \n", buf);

      printf(">>> Aguarde...\n");
      
      /* Cria diretorio com IP do cliente para amarmazenar o arquivo
      * recebido do cliente
      */
      mkdir(client_ip, 0766);
      chdir(client_ip);

      /* cria o arquivo */
      if((fd = open(arq_nome, O_RDWR | O_CREAT, FILE_MODE)) < 0) {
         fatal("Nao foi possivel abrir arquivo\n");
         close(fd);
         close(sa);
         continue;
      }

      /* Recebe os dados do arquivo */
      while ((bytes = recv(sa, buf, BUF_SIZE, 0)) > 0) {
         write(fd, buf, bytes);
      }

      time(&time2);
      /* Informa Na saida Padrao o onde o arquivo foi armazenado */
      printf(">>> Arquivo Recebido com Sucesso !\n");
      printf(">>> Aviso:\n");
      printf(">>>\tCheque o Arquivo \"%s\" no Diretorio .\"/%s\"\n>>>\n", arq_nome, client_ip);

      chdir(".."); /* Volta ao diretorio de origem */

      close(fd);             /* Fechar o arquivo */
      close(sa);             /* Encerra a conexao */

      printf(">>> Dados Transferidos  em : %d segundos\n", time2 - time1);
      printf(">>> Conexao Encerrada com %s\n\n", client_ip);
   }

   return 0;
}

Scripts recomendados

ripmime

Automatizando configuração e conexão wireless

HtmlPageDown - Baixe páginas HTML (cURL)

Jogo da Forca-C

Acertando a hora!!


  

Comentários
[1] Comentário enviado por leeeofrancis em 14/07/2016 - 23:41h

O link não disponível para acessar Cliente. Poderia atualizar?


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts