1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

ajuda em C - aplicação cliente servidor envio ficheiro

Discussão em 'Programação' iniciada por The Dealer, 30 de Outubro de 2008. (Respostas: 2; Visualizações: 1358)

  1. The Dealer

    The Dealer Power Member

    Implementei uma aplicação cliente servidor (dois ficheiros separados), que por agora a unica coisa que faz é enviar uma messagem do cliente para o servidor.

    Mas o que eu quero fazer e não estou a conseguir, é através de sockets, enviar um ficheiro do servidor para o cliente. Estive a fazer uma pesquisa mas não encontrei nada de relevante, pelo menos na linguagem que eu preciso, C.

    Alguem me pode ajudar?
     
  2. countzero

    countzero Power Member

    Olá,

    Vais ter que desenhar um um protocolo, por muito simples que seja, para controlar as transferências de ficheiros entre servidor e cliente. Inicialmente, um comando LIST (para listagem de ficheiros) e um GET (para descarregares o ficheiro), devem chegar para começares a testar o protótipo.

    Podes usar um canal (socket) para controlo e outro canal para transferência de dados. Mas, talvez seja mais simples começares com apenas um canal - podes utilizar o que já tens para envio de mensagens simples.

    Legenda:
    C - Cliente
    S - Servidor

    O protocolo pode usar inteiros para as mensagens de controlo, por exemplo:
    Código:
    #define LIST_QUERY 1
    #define GET_FILE 2
    #define LIST_RESPONSE 3
    #define FILE_INFO 4
    
    
    Um cenário possível, após teres estabelecido a ligação entre cliente e servidor:
    1. O cliente começa por pedir alista de ficheiros no servidor:​
    C:
    [LIST_QUERY]

    2. Servidor responde:
    S:
    [LIST_RESPONSE][número de ficheiros]


    3. Cliente prepara-se para receber a lista de ficheiros. Para simplificar, imagina que cada nome de ficheiro é uma string de 256 bytes (com tamanho fixo). Portanto, se a resposta de S for
    [LIST_RESPONSE][30]
    , o cliente aloca um array para 30 strings:
    char **filelist;
    filelist = (char **) calloc(30, sizeof(char *));
    4. Cliente recebe a stream de bytes (30 * 256, neste caso). Contendo as strings com os nomes dos ficheiros e imprime a lista:
    usei_goto_porque_sou_preguicoso:
    recv(..., ..., ..., ...); /* lê 256 bytes do socket */
    /* Aloca espaço para a string */
    filelist = (char *) calloc(1, 256);
    /* Copia blah blah */
    memcpy[filelist[i++], receive_buffer, 256);
    goto usei_goto_porque_sou_preguicoso;
    for(....) /* imprime os nomes e índices dos ficheiros */
    5. Cliente quer o 10º ficheiro da lista:
    C: [GET_FILE][10]

    6. Servidor responde com informação do ficheiro, que indica que irá enviar o ficheiro e que este tem 4096 bytes:
    S: [FILE_INFO][4096]

    7. Cliente cria um ficheiro local, com o nome do ficheiro recebido anteriormente; coloca, no ficheiro recém criado, os bytes recebidos no socket, até 4096 bytes; no final, fecha o ficheiro:
    fopen(...)
    fwrite(...)

    Isto foi pensado em cima do joelho e é apenas para te dar uma ideia geral de uma possível arquitectura (muito simples). Existem erros, de desenho e implementação, mas espero que te ajude a começar a partir o problema.

    Cumps,
    JP
     
  3. The Dealer

    The Dealer Power Member

    Obrigado ;) Vou ver o que consigo fazer :)
     

Partilhar esta Página