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:
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:
6. Servidor responde com informação do ficheiro, que indica que irá enviar o ficheiro e que este tem 4096 bytes:
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