
Enviado em 07/04/2013 - 18:39h
Boa noite, estou fazendo uma aplicação cliente/servidor onde o cliente informa o caminho do arquivo e o envia ao servidor e ele salva o arquivo. Ambos compilam o código segue abaixo e gostaria de saber se e possível enviar o arquivo compactado.
#include<sys/socket.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
int sock;
struct sockaddr_in address;
char caminho[100], tam[6];
FILE *origem, *copia;
char *localOrigem = "/home/maryfredy/Área de Trabalho/origem.txt";
char *localCopia = "/home/maryfredy/Área de Trabalho/copia.txt";
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 abrirArquivo( ) {
if ((origem=fopen (caminho, "rb")) == NULL)
{
printf ("o arquivo de origem nao pode ser aberto\n");
exit (1);
}
if ((copia=fopen (localCopia, "wb")) == NULL)
{
printf ("o arquivo para copia nao pode ser aberto\n");
exit (1);
}
}
long calcTamArq(FILE *arquivo) {
long Atual = ftell(arquivo);
long tam;
fseek(arquivo, 0l, SEEK_END);
tam = ftell(arquivo);
fseek(arquivo, Atual, SEEK_SET);
printf ("TAMANHO: %ld\n",tam);
return tam;
}
void enviar(char mensagem[] ){
if(send(sock,mensagem,sizeof(mensagem),0)<0){
perror("Erro no envio de dados");
exit(1);
}
}
char* recebe(){
char recebido[100];
if(recv(sock,recebido,sizeof(recebido),0)<0){
perror("Erro no recebimento de dados ");
exit(1);
}
}
void enviaChar(char mensagem ){
if(send(sock,mensagem,sizeof(mensagem),0)<0){
perror("Erro no envio ");
exit(1);
}
}
main ( ){
char ch[1];
long tamArq;
char serverName[20];
printf("Digite o IP ou hostname do servidor ao qual deseja de conectar: ");
gets(serverName);
if(conectar(serverName)){
printf ("Digite o caminho do arquivo:\n");
gets(caminho);
abrirArquivo ( );
tamArq = calcTamArq(origem);
sprintf(tam,"%ld",tamArq);
printf ("TAMANHO: %s\n",tam);
enviar(tam);
while(!feof(origem))
{
ch[0] = getc (origem);
if(ferror(origem)) {
printf("erro lendo o arquivo");
break;
}
enviar(ch);
putc (ch[0], copia);
if(ferror(copia)) {
printf("erro na gravacao do arquivo");
break;
}
}
fclose (origem);
fclose (copia);
return 0;
}
else {
printf("\nNao foi possivel conectar...");
}
}
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>
int sockServer, sockClient, addrlen;
struct sockaddr_in address;
char arquivo[100], copia[6]
;
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;
}
void receber (){
if(recv(sockClient,copia,sizeof(copia),0)<0){
perror("Erro no recebimento de dados");
exit(1);
}
}
void recebeChar (char ch[]){
if(recv(sockClient,ch,sizeof(ch),0)<0){
perror("Erro no recebimento de dados");
exit(1);
}
}
main ( ){
char *localCopia = "/home/maryfredy/Área de Trabalho/copia.txt";
FILE *Copia;
char ch[1];
long fileSize;
if (iniciaServer( )) {
printf("\nConexao estabelecida!");
if ((Copia=fopen (localCopia, "wb")) == NULL)
{
printf ("Arquivo para copia nao pode ser aberto\n");
exit (1);
}
printf("\nTamanho do Arquivo: %s\n\n", copia);
fileSize = atof(copia);
printf("\nTamanho do Arquivo: %ld\n\n", fileSize);
int i;
for(i=0;i<fileSize;i++){
recebeChar(ch);
putc (ch[0], Copia);
if(ferror(Copia)) {
printf("erro na gravacao do arquivo");
break;
}
}
printf("fim");
fclose (Copia);
fclose (sockServer);
close(sockClient);
}
}
Cirurgia para acelerar o openSUSE em HD externo via USB
Void Server como Domain Control
Modo Simples de Baixar e Usar o bash-completion
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
Como fazer a conversão binária e aplicar as restrições no Linux
Como quebrar a senha de um servidor Linux Debian
Como bloquear pendrive em uma rede Linux
Um autoinstall.yaml para Ubuntu com foco em quem vai fazer máquina virtual
Instalar GRUB sem archinstall no Arch Linux em UEFI Problemático









