Tranferência de arquivos entre cliente e servidor usando sockets

1. Tranferência de arquivos entre cliente e servidor usando sockets

Frederick Honorio e Silva
Fredysilva

(usa Ubuntu)

Enviado em 27/03/2013 - 16:20h

Boa tarde,

Estou fazendo uma aplicação em C entre cliente e servidor usando sockets onde quando o cliente se conecta ao servidor pede se o caminho do arquivo onde se localiza para ser enviado da máquina do cliente para o servidor. O servidor recebe o arquivo do cliente e o salva.

Cheguei na conexão do cliente e servidor eles se conectam, e terminei onde no código do cliente pede se o caminho.

Alguém pode me dar um caminho ou uma dica para prosseguir com esta aplicação.

Para pedir o caminho para o cliente, esta linha tem que estar no código do cliente ou do servidor ?

Mais uma vez obrigado!!!


  


2. Re: Tranferência de arquivos entre cliente e servidor usando sockets

Ton Melo
IZhaq_Melo

(usa FreeBSD)

Enviado em 27/03/2013 - 16:26h

Fredysilva escreveu:

Boa tarde,

Estou fazendo uma aplicação em C entre cliente e servidor usando sockets onde quando o cliente se conecta ao servidor pede se o caminho do arquivo onde se localiza para ser enviado da máquina do cliente para o servidor. O servidor recebe o arquivo do cliente e o salva.

Cheguei na conexão do cliente e servidor eles se conectam, e terminei onde no código do cliente pede se o caminho.

Alguém pode me dar um caminho ou uma dica para prosseguir com esta aplicação.

Para pedir o caminho para o cliente, esta linha tem que estar no código do cliente ou do servidor ?

Mais uma vez obrigado!!!


Post o esqueleto.. vamos trabalhar na sua lógica.



3. Re: Tranferência de arquivos entre cliente e servidor usando sockets

Paulo
paulo1205

(usa Ubuntu)

Enviado em 27/03/2013 - 19:02h

Não sei se entendi sua dúvida. Mas, pensando por analogia, faço-lhe a seguinte pergunta: quando você escolhe um arquivo para upload no seu web browser, é o browser que faz a seleção ou é o servidor?


4. Re: Tranferência de arquivos entre cliente e servidor usando sockets

Frederick Honorio e Silva
FredySilva

(usa Ubuntu)

Enviado em 27/03/2013 - 22:38h

Entendi a dica Paulo !!!! Seguirei este caminho e farei os teste e te dou uma posição .

Grato


5. Re: Tranferência de arquivos entre cliente e servidor usando sockets

Frederick Honorio e Silva
FredySilva

(usa Ubuntu)

Enviado em 28/03/2013 - 14:33h

Pessoal, este é o código sobre a transferência de arquivos entre sockets. A ideia e quando o cliente se conecta ao servidor , pede se ao cliente o caminho do arquivo que ele deseja enviar para o servidor e depois que o cliente escolhe o arquivo , pede ao cliente que ele escolha o novo nome do arquivo que será salvo no servidor.

O servidor, por sua vez, apenas recebe o arquivo e o salva.

A lógica eu compreendi , mas estou com muita dificuldade para colocar tudo em sintaxe com os códigos em C.

A quem puder me ajudar , segue o código.

Grato

servidor.c

#include<sys/types.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>

int sockServer,sockClient,addrlen;
struct sockaddr_in adress;
int FATOR_BUFFER = 0;
int tamBuf = 0;
char *bytes, *buffer;
int inicio = 0;
int fim = 0;
int numElem = 0;
char arquivo[100];

int inserir(char elemento) {

if(numElem == tamBuf) {
return -1;
}

else {
buffer[fim] = elemento;
fim = ((fim + 1) % tamBuf);
numElem ++;
return 0;
}

}

char remover() {

char aux;

if (numElem == 0) {
return -1;
}

aux = buffer[inicio];
inicio = ( (inicio + 1) % tamBuf );
numElem --;
return aux;

}

int adicionarNoBuffer(int quant, FILE* file) {

int i, lidos;

lidos = fread(bytes, sizeof(char), quant, file);

for (i=0; i<lidos; i++) {
inserir(bytes[i]);
}

return lidos;

}

int consumirDoBuffer(int *quant) {

int i, final;

if (*quant>numElem) {
*quant = numElem;
}

for (i=0; i<(*quant); i++) {
bytes[i] = remover();
}

if (numElem>=(tamBuf*0.9)) {
return 2;
}

if (numElem<=(tamBuf*0.1)) {
return 1;
}

return 0;

}



int iniciaServer ( ){

system("clear");

if ((sockServer = socket(AF_INET, SOCK_STREAM, 0)) > 0) {
printf("Socket criado\n");
}

address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(8888);



if (bind(sockServer,(struct sockaddr *)&address,sizeof(address)) == 0) {
printf("Aguardando conexão...\n");
}


listen(sockServer, 3);

addrlen = sizeof(struct sockaddr_in);


sockClient = accept(sockServer,(struct sockaddr *)&address,&addrlen);


if (sockClient > 0) {
return 1;
}

return 0;

}
}

int salvarArquivo(FILE *file) {

char bytes[200], md5[33], md5client[100];
char ack = 'a';
int nbytes, statusBuf, fimArq;
FILE *md5file;

if (!file) {
return 0;
}

send(sockServer, &ack, sizeof(char), 0);

do {
recv(sockServer, &nbytes, sizeof(int), 0);
recv(sockServer, bytes, nbytes, 0);
adicionarNoBuffer(bytes, nbytes);
statusBuf = consumirDoBuffer(TAXA_CONSUMO, file);
send(sockServer, &statusBuf, sizeof(int), 0);
recv(sockServer, &fimArq, sizeof(int), 0);

} while (fimArq);

while (numElem) {
consumirDoBuffer(TAXA_CONSUMO, file);

}

fclose(file);

recv(sockServer, md5, sizeof(char)*32, 0);
md5[32] = 0;
printf("\n\nO md5sum do arquivo no servidor é %s", md5);
sprintf(md5client, "md5sum %s > %s.md5", arquivo, arquivo);
system(md5client);
sprintf(md5client, "%s.md5", arquivo);
md5file = fopen(md5client, "r");
fread(md5client, sizeof(char), 32, md5file);
md5client[32] = 0;
printf("\nO md5sum do arquivo recebido é %s", md5client);

if (strcmp(md5, md5client)) {
printf("\n\nHouve erros na transferência...");
}

else {
printf("\n\nO arquivo foi transferido de forma consistente...");
}

getchar();
return 1;

#define PORTA 8888
#define MAXBUF 256
#define MAXCONECT 5


int main() {
do {
printf("\nTamanho do buffer do servidor (em bytes) (mín.: 2000): ");
scanf("%d", &tamBuf);
}
while (tamBuf<2000);

int tamBufClient = tamBuf/2;
buffer = (char *) malloc(sizeof(char)*tamBuf);

if (iniciaServer()) {
printf("\nConexão estabelecida!");
send(sockClient, &tamBufClient, sizeof(int), 0);
recv(sockClient, &FATOR_BUFFER, sizeof(int), 0);
bytes = (char *) malloc(sizeof(char)*FATOR_BUFFER*2);
printf("\nO tamanho do buffer do servidor é: %d", tamBuf);
printf("\nO fator de buffer do cliente é: %d", FATOR_BUFFER);

salvarArquivo(fopen(arquivo, "wb"));
}
else {
printf("\nNão foi possível conectar...");
}

close(sockClient);
close(sockServer);

}

cliente.c

#include<sys/types.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>


#define TAXA_CONSUMO 100


int sock;
struct sockaddr_in address;
int tamBuf = 0;
char *buffer;
int inicio = 0;
int fim = 0;
int numElem = 0;
char arquivo[100];

#define PORTA 8888

int inserir(char elemento) {

if (numElem == tamBuf) {
return -1;
}

else {

buffer[fim] = elemento;
fim = ((fim + 1) % tamBuf);
numElem ++;
return 0;

}

}

char remover() {

char aux;

if (numElem == 0) {
return -1;
}

aux = buffer[inicio];
inicio = ( (inicio + 1) % tamBuf );
numElem --;
return aux;

}

int conectar(char *server) {

if ((sock = socket(AF_INET, SOCK_STREAM, 0)) > 0) {
printf("Socket configurado\n");
}
address.sin_family = AF_INET;
address.sin_port = htons(8888);
inet_pton(AF_INET,server,&address.sin_addr);


if (connect(sock,(struct sockaddr *)&address,sizeof(address)) == 0) {
return 1;
}

return 0;

}

void solicitarLista() {

char ask = 'l';
int nbytes, i;
char arquivos[2000];

send(sock, &ask, sizeof(char), 0);
recv(sock, &nbytes, sizeof(int), 0);
recv(sock, arquivos, nbytes, 0);
printf("\n\nEntre com o caminho para enviar o arquivo: ");
gets(arquivos);
printf("\n\nPressione ENTER para visualizar lista de arquivos disponíveis: ");
getchar();

for (i=0; i<nbytes; i++) {
printf("%c", arquivos[i]);
}

}

int solicitarArquivo(char *arquivo) {

int tam;
char c;

tam = strlen(arquivo);
printf("Arquivo solicitado ...");
send(sock, arquivo, tam+1, 0);
recv(sock, &c, 1, 0);

if (c=='s') {
return 1;
}

return 0;
}

int adicionarNoBuffer(char *info, int quant) {

int i;

for (i=0; i<quant; i++) {
inserir(*info);
info++;
}

}

int consumirDoBuffer(int quant, FILE* file) {

char c;
int i, final;

final = quant;

if (quant>numElem) {
final = numElem;
}

for (i=0; i<final; i++) {
c = remover();
fwrite(&c, sizeof(char), 1, file);
}

if (numElem>=(tamBuf*0.9)) {
return 2;
}

if (numElem<=(tamBuf*0.1)) {
return 1;
}

return 0;

}

void enviarArquivo(FILE *file) {

char c, md5[100];
int addBytes = FATOR_BUFFER*2;
int remBytes = FATOR_BUFFER;
int statusBufClient = 0;
int statusBuf = 0;
int control = 1;
FILE *md5file;

if (!file) {
return;
}

sprintf(md5, "md5sum %s > %s.md5", arquivo, arquivo);
system(md5);
sprintf(md5, "%s.md5", arquivo);
md5file = fopen(md5, "r");
fread(md5, sizeof(char), 32, md5file);

recv(sockClient, &c, sizeof(char), 0);

do {

if (!(feof(file))) {
adicionarNoBuffer(addBytes, file);
}

statusBuf = consumirDoBuffer(&remBytes);
imprimirBuffer(numElem, tamBuf);
send(sockClient, &remBytes, sizeof(int), 0);
send(sockClient, bytes, remBytes, 0);
recv(sockClient, &statusBufClient, sizeof(int), 0);

if (statusBufClient==1) {
remBytes = FATOR_BUFFER + (rand() % (FATOR_BUFFER/2)) + (FATOR_BUFFER/2);
}

if (statusBufClient==2) {
remBytes = FATOR_BUFFER - (rand() % (FATOR_BUFFER/4)) - (FATOR_BUFFER/3);
}

if (statusBuf==1) {
addBytes = remBytes*2;
}

if (statusBuf==2) {
addBytes = remBytes/2;
}

send(sockClient, &numElem, sizeof(int), 0);

} while (numElem);

send(sockClient, md5, sizeof(char)*32, 0);
return;

}


int main() {

int consumo = TAXA_CONSUMO;
char serverName[20];
FILE *file;

printf("Digite o IP ou hostname do servidor ao qual deseja de conectar: ");
gets(serverName);

if (conectar(serverName)) {
printf("Conectado ao servidor!\n");
recv(sock, &tamBuf, sizeof(int), 0);
send(sock, &consumo, sizeof(int), 0);
buffer = (char *) malloc(sizeof(char)*tamBuf);
solicitarLista();
printf("Digite um nome de arquivo para solicitar: ");
gets(arquivo);

if (solicitarArquivo(arquivo)) {
printf("\nArquivo encontrado...\n");
printf("\nEscolha o nome para salvar o arquivo: ");
gets(arquivo);
enviarArquivo(aguardarSolicitacao());
}

else {
printf("Arquivo não encontrado no servidor\n");
}
}

close(sock);

}






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts