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);
}