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

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?
 
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
 
Back
Topo