Erro ao manipular um arquivo usando sockets.

1. Erro ao manipular um arquivo usando sockets.

Frederick Honorio e Silva
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.



  


2. Re: Erro ao manipular um arquivo usando sockets.

Perfil removido
removido

(usa Nenhuma)

Enviado em 31/03/2013 - 23:15h

Cara, esse código tá ruim de ser lido estando postado desse jeito.

Existe uma tag prá código, [ code ] [ /code ] (sem os espaços nos colchetes) que são usadas prá formatação.

Fica assim:

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

}


Edite a postagem, pegue o código que você tem e que deve estar indentado e cole por cima de tudo, usando [ code ]. Cada um em um [ code ]. Depois você recoloca os erros do lado de fora.




3. Re: Erro ao manipular um arquivo usando sockets.

Frederick Honorio e Silva
FredySilva

(usa Ubuntu)

Enviado em 01/04/2013 - 06:57h

Erro cliente.c

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


cliente.c

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

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



Erro servidor.c

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]


servidor.c
[code]
#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);

}
[\code]

Agora sim, obrigado pela dica, desculpe o código todo desorganizado.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts