Jump to content
Fórum Script Brasil
  • 0

Comunicação entre processos.


Paulo Jardim

Question

Galera,

Não sei por onde começar com isso, mas já andei pesquisando na internet e vi a possibilidade disso acontecer usando processos.

Bom, vou explicar o que preciso fazer:

Tenho de desenvolver um "file server" em c para armazenar arquivos que vão ser enviados por outros processos de outras linguagens, Java por exemplo, e também enviar os mesmos arquivos caso solciitado.

Bom, esse serviço deve estar sempre ativo "escutando". Bom, o próximo passo é um pouco mais complexo:

caso o servidor de arquaivos "caia" devo requisitar o arquivo solicitado pelo Outro processo aos processos ativos.

Ou seja, caso o processo X solicite o arquivo Y e o servidor de arquivos esteja OFF, o processo X agora deve procurar procurar agora o arquivo Y nos processos ativos. claro que os mesmos devem ter cópia dos arquivos que estão nos processos.

SImples não.

Bom, para começar só preciso entender se isso será feito atravéz de Socket ou de alguma outra forma, e se existe exemplos disso na internet.

Procurei galera, só achei voa socket.

Link to comment
Share on other sites

1 answer to this question

Recommended Posts

  • 0

Galera,

achei isso para o linux. Mais alguém sabe como posso usar isso no devc++ ou como posso utilizar isso pro windows?

/* @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("não 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 padrão 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;
}

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652.1k
×
×
  • Create New...