Enviado em 08/08/2016 - 11:12h
Eai galera? Beleza? Já faz um tempo que não apareço por aqui, tava meio parado com tudo mesmo. Então, meu problema é, estou dando uma estudada em sockets e estou no meio de um programa que tem as funções de enviar e receber arquivos implementadas. O código até funciona mais ou menos, mas perfeitamente só em algumas situações, em arquivos pequenos. Realmente busco por uma solução para "qualquer" tamanho de arquivo que funcione tanto nos posix quando no windows, que apesar de terem a mesma API (freebsd) em se tratando dos sockets, podem ter algumas peculiaridades no caso de arquivos.
Estive buscando a solução mais simples mesmo e aqui vai o código das duas funções que criei:
Afinal, o que tem a dizer?
ps: Conheço a biblioteca sendfile.h, mas não quero usá-la já que pretendo que o código seja compilável para windows.
Estive buscando a solução mais simples mesmo e aqui vai o código das duas funções que criei:
Tem algumas coisas comentadas inúteis ai fiquei com preguiça de tirar :p. De qualquer forma, gostaria que alguém comentasse algumas implementações para que isso passasse a funcionar para arquivos grandes também. A ideia é que quanto a função download executa de um lado, a upload é executada do outro.(servidor-cliente), ou vice versa.
void upload(char *s, int sockfd){
FILE *f;
int n;
f=fopen(s,"rb");
char buff[1024];
if(f==NULL){
perror("Read error");
send(sockfd, buff, sizeof buff, 0);
return;
}
printf("Uploading... \n");
do{
memset(buff,0,sizeof buff);
n=fread(buff, sizeof(char), 1024, f);
if(send(sockfd, buff, n, 0)<0){
perror("send error\n");
return;
}
//recv(sockfd, buff, sizeof buff, 0);
printf("|");
}while(n==1024*sizeof(char));
fclose(f);
}
void download(char *s, int sockfd){
FILE *f;
f=fopen(s,"wb");
int n;
char buff[1024];
if(f==NULL){
perror("write error");
return;
}
printf("Downloading file....\n");
do{
memset(buff,0,sizeof buff);
if((n=recv(sockfd, buff, sizeof buff, 0))<0){
perror("read error\n");
return;
}
fwrite(buff, n, 1, f);
//send(sockfd, "go", sizeof "go", 0);
printf("|");
}while(n>0);
fclose(f);
}
Afinal, o que tem a dizer?
ps: Conheço a biblioteca sendfile.h, mas não quero usá-la já que pretendo que o código seja compilável para windows.