Ir para conteúdo
Fórum Script Brasil
  • 0

Comunicação entre processos.


Paulo Jardim

Pergunta

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 para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 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 para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...