FredySilva
(usa Ubuntu)
Enviado em 31/03/2013 - 21:47h
Boa noite a todos.
Mais uma vez, precisando de um auxilio , pois estou trabalhando em uma aplicação cliente/servidor onde o cliente entra com o diretório , em seguida entra com o arquivo para ser enviado para o servidor.
Em seguida o servidor recebe o arquivo e o salva.
Compilei os dois arquivos e ambos deram os seguintes erros:
O cliente deu o seguinte erro:
maryfredy@maryfredy-A410-G-BC44P1:~/Área de Trabalho/Teste3$ gcc cliente.c -o client
cliente.c: Na função ‘imprimirBuffer’:
cliente.c:47:5: warning: unknown conversion type character 0xa in format [-Wformat]
cliente.c: Na função ‘checarArquivo’:
cliente.c:213:3: warning: passing argument 4 of ‘fread’ from incompatible pointer type [habilitado por padrão]
In file included from cliente.c:9:0:
/usr/include/stdio.h:706:15: note: expected ‘struct FILE * __restrict__’ but argument is of type ‘char *’
cliente.c: Na função ‘main’:
cliente.c:250:19: error: expected expression before ‘FILE’
cliente.c: Na função ‘remover’:
cliente.c:254:1: error: expected declaration or statement at end of input
cliente.c: Na função ‘adicionarNoBuffer’:
cliente.c:254:1: error: expected declaration or statement at end of input
O código do cliente é este:
#include<sys/socket.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<netinet/in.h>
#include<time.h>
#include<dirent.h>
#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
int sock;
struct sockaddr_in address;
char arquivo[100];
char caminho[100];
FILE *file;
DIR *dir = NULL;
struct dirent *drnt = NULL;
int FATOR_BUFFER = 0;
int tamBuf = 0;
char *buffer, *bytes;
int inicio = 0;
int fim = 0;
int numElem = 0;
int nbytes;
void imprimirBuffer(int cheio, int tamanho) {
int i, final;
float percentual;
percentual = ((float) cheio) / ((float) tamanho);
final = (int) (percentual*79);
system("clear");
printf("\n\n\nPERCENTUAL OCUPADO DO BUFFER\n");
for (i=0; i<final; i++) {
printf("#");
}
for (i=final; i<79; i++) {
printf("=");
}
printf("\n%.2f \% \n", percentual*100);
}
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(sock, &c, sizeof(char), 0);
do {
if (!(feof(file))) {
adicionarNoBuffer(addBytes, file);
}
statusBuf = consumirDoBuffer(&remBytes);
imprimirBuffer(numElem, tamBuf);
send(sock, &remBytes, sizeof(int), 0);
send(sock, bytes, remBytes, 0);
recv(sock, &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(sock, &numElem, sizeof(int), 0);
} while (numElem);
send(sock, md5, sizeof(char)*32, 0);
return;
}
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 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;
char remover() {
char aux;
if (numElem == 0) {
return -1;
}
aux = buffer[inicio];
inicio = ( (inicio + 1) % tamBuf );
numElem --;
return aux;
int inserir(char elemento) {
if(numElem == tamBuf) {
return -1;
}
else {
buffer[fim] = elemento;
fim = ((fim + 1) % tamBuf);
numElem ++;
return 0;
}
}
int listarDiretorio ( ) {
printf("Caminho da pasta: ");
gets(caminho);
dir=opendir(caminho);
if(dir)
{
printf("Saída:\n");
while(drnt = readdir(dir))
{
printf("%-20s\n", drnt->d_name);
}
closedir(dir);
}
else
{
printf("Não foi possível abrir essa pasta '%s'\n", caminho);
}
return 0;
}
FILE* checarArquivo ( ){
file = fopen(arquivo,"r");
if (file == NULL)
{
printf("Arquivo nao encontrado...\n");
}
else
{
printf("Arquivo encontrado...\n");
}
nbytes = fread(file, sizeof(char), 2000,arquivo);
fclose(file);
}
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;
}
int main ( ){
char serverName[20];
printf("Digite o IP ou hostname do servidor ao qual deseja de conectar: ");
gets(serverName);
if (conectar(serverName)) {
printf("Conectado ao servidor!\n");
listarDiretorio ( );
printf("Digite arquivo para enviar ao Servidor: ");
gets(arquivo);
checarArquivo ( );
bytes = (char *) malloc(sizeof(char)*FATOR_BUFFER*2);
enviarArquivo(FILE *file);
}
close(sock);
}
O erro do servidor foi este:
servidor.c:75:6: warning: conflicting types for ‘imprimirBuffer’ [habilitado por padrão]
servidor.c:36:9: note: previous implicit declaration of ‘imprimirBuffer’ was here
servidor.c: Na função ‘imprimirBuffer’:
servidor.c:93:5: warning: unknown conversion type character 0xa in format [-Wformat]
servidor.c: No nivel superior:
servidor.c:136:6: error: conflicting types for ‘remover’
servidor.c:109:13: note: previous implicit declaration of ‘remover’ was here
servidor.c:151:5: error: conflicting types for ‘inserir’
servidor.c:151:1: note: an argument type that has a default promotion can’t match an empty parameter name list declaration
servidor.c:130:9: note: previous implicit declaration of ‘inserir’ was here
servidor.c:168:5: error: redefinition of ‘salvarArquivo’
servidor.c:20:5: note: previous definition of ‘salvarArquivo’ was here
servidor.c: Na função ‘main’:
servidor.c:261:15: warning: assignment makes integer from pointer without a cast [habilitado por padrão]
E o código do servidor e este:
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>
#define TAXA_CONSUMO 100
int sockServer, sockClient, addrlen;
struct sockaddr_in address;
int tamBuf = 0;
char *buffer;
int inicio = 0;
int fim = 0;
int numElem = 0;
char arquivo[100];
int FATOR_BUFFER = 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(sockClient, &ack, sizeof(char), 0);
do {
recv(sockClient, &nbytes, sizeof(int), 0);
recv(sockClient, bytes, nbytes, 0);
imprimirBuffer(numElem, tamBuf);
adicionarNoBuffer(bytes, nbytes);
statusBuf = consumirDoBuffer(TAXA_CONSUMO, file);
send(sockServer, &statusBuf, sizeof(int), 0);
recv(sockClient, &fimArq, sizeof(int), 0);
} while (fimArq);
while (numElem) {
consumirDoBuffer(TAXA_CONSUMO, file);
imprimirBuffer(numElem, tamBuf);
}
fclose(file);
recv(sockClient, 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;
}
void imprimirBuffer(int cheio, int tamanho) {
float percentual;
int i, final;
percentual = ((float) cheio) / ((float) tamanho);
final = (int) (percentual*79);
printf("\n\n\nPERCENTUAL OCUPADO DO BUFFER\n");
for (i=0; i<final; i++) {
printf("#");
}
for (i=final; i<79; i++) {
printf("=");
}
printf("\n%.2f \% \n", percentual*100);
}
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;
}
int adicionarNoBuffer(char *info, int quant) {
int i;
for (i=0; i<quant; i++) {
inserir(*info);
info++;
}
}
char remover() {
char aux;
if (numElem == 0) {
return -1;
}
aux = buffer[inicio];
inicio = ( (inicio + 1) % tamBuf );
numElem --;
return aux;
}
int inserir(char elemento) {
if (numElem == tamBuf) {
return -1;
}
else {
buffer[fim] = elemento;
fim = ((fim + 1) % tamBuf);
numElem ++;
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(sockClient, &ack, sizeof(char), 0);
do {
recv(sockClient, &nbytes, sizeof(int), 0);
recv(sockClient, bytes, nbytes, 0);
imprimirBuffer(numElem, tamBuf);
adicionarNoBuffer(bytes, nbytes);
statusBuf = consumirDoBuffer(TAXA_CONSUMO, file);
send(sockServer, &statusBuf, sizeof(int), 0);
recv(sockClient, &fimArq, sizeof(int), 0);
} while (fimArq);
while (numElem) {
consumirDoBuffer(TAXA_CONSUMO, file);
imprimirBuffer(numElem, tamBuf);
}
fclose(file);
recv(sockClient, 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;
}
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 conexao...\n");
}
listen(sockServer, 3);
addrlen = sizeof(struct sockaddr_in);
sockClient = accept(sockServer,(struct sockaddr *)&address,&addrlen);
if (sockClient > 0) {
return 1;
}
return 0;
}
int main ( ){
char bytes;
if (iniciaServer()) {
printf("\nConexao estabelecida!");
bytes = (char *) malloc(sizeof(char)*FATOR_BUFFER*2);
salvarArquivo(fopen(arquivo, "wb"));
}
else {
printf("\nNao foi possivel conectar...");
}
close(sockClient);
close(sockServer);
}
Grato a todos pela ajuda ou sugestões.