Ir ao conteúdo

Problema com FILE c++ ?


Rafaelbvj

Posts recomendados

Postado

É o seguinte eu criei um programa que recebe uma mensagem e a mensagem é armazenada na variavel buffer e o buffer fica em um loop com vários ifs só que o que está dando problema é esse :

if(strncmp(buffer,"download",8)==0){
memset(buffer,0,sizeof(buffer));
send(sock,"Digite o Local do arquivo:",strlen("Digite o Local do arquivo:"),0);
for(;;Sleep(1000)){
recv(sock,buffer,sizeof(buffer),0);
if(buffer==NULL||strcmp(buffer,"")==0||strcmp(buffer," ")==0){
memset(buffer,0,sizeof(buffer));

}else{break;}

}
FILE *file = fopen(buffer,"rb");
fseek(file,0,SEEK_END);
tamanho =ftell(file);
cout<<tamanho<<endl;
rewind(file);
memset(tam,0,sizeof(tam));
sprintf(tam,"%lu",tamanho);
char *dados=(char*)malloc(sizeof(char)*tamanho);
fread(dados,1,tamanho,file);
SOCKET sock2 = socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN conf2;
conf2.sin_addr.s_addr = inet_addr(IP);
conf2.sin_family = AF_INET;
conf2.sin_port = htons(5202);
for(;connect(sock2,(SOCKADDR*)&conf2,sizeof(conf2))==SOCKET_ERROR;){Sleep(500);}
send(sock2,buffer,strlen(buffer),0);
Sleep(3000);
send(sock2,tam,strlen(tam),0);
Sleep(3000);
send(sock2,dados,tamanho,0);
Sleep(10000);
cout<<WSAGetLastError()<<endl;
fclose(file);
memset(buffer,0,sizeof(buffer));
free(dados);
closesocket(sock2);
}
if(buffer[0]=='c'&&buffer[1]=='l'&&buffer[2]=='s'){
ofstream ops(arquivo);
ops.flush();
ops.close();
memset(buffer,0,sizeof(buffer));
}

O comando ftell retorna -1, e até agora eu nao descobrir porque não está retornando o tamanho do arquivo , mas o impressionante é que quando eu coloco um local de um arquivo exato sem usar variável dá certo ex :

FILE *file = fopen("C:\\Downloads\\a.exe","rb");

Postado
Já conferiu se o conteúdo armazenado no buffer chega correto, pra poder abrir o arquivo?

sim , o outro programa está sendo autenticado e está recebendo os dados , o problema é esse parte mesmo de envio, quando verifico o erro com o WSAGetLastError(); ele me retorna o erro 10014

Postado
O erro 10014 é de endereço incorreto.

pode ser por receber um ponteiro inválido ou então, está recebendo uma estrutura menor do que deveria "strlen(sockaddr)".

Já conferiu se o socket está ativo no momento do recebimento?

Talvez esse site te ajude: MSDN - Windows Sockets Error Codes

sim verifiquei tudo , vamos falar melhor me adiciona no facebook https://www.facebook.com/rafael.rafa.927758

quando uso váriavel o file é igual a NULL , já verifiquei se a variavel buffer está vazia sem caminho mas nao está , quando nao uso , funciona perfeitamente :(

Postado

Verificou se não há caracteres especiais "escondidos" na string?

O valor retornado pelo "strlen(buffer)", condiz com o tamanho contado visualmente na tela?

Será que não há um espaço antes do nome do arquivo?

Postado
Verificou se não há caracteres especiais "escondidos" na string?

O valor retornado pelo "strlen(buffer)", condiz com o tamanho contado visualmente na tela?

Será que não há um espaço antes do nome do arquivo?

nao , nao tem espaços , eu contei visualmente os caracteres a partir do zero e tinha 19 e quando exibi o strlen(buffer); tinha 21

Postado
Achado o erro, então.

De 0 a 19, são 20 e o resultado do strlen foi 21. Tem um caracter sobrando.

Aconselho a fazer uma rotina que limpe os caracteres indesejáveis.

como eu poderia fazer isso ?

Postado

Um exemplo bem simples, usando a função "isalnum()", da biblioteca "ctypes.h".


int main(void)
{
char buffer_entrada[] = "Te ste.t xt";
char buffer_saida[1024] = {'\0'};
unsigned contador_entrada = 0;
unsigned contador_saida = 0;

for( contador_entrada = 0; contador_entrada < strlen(buffer_entrada); contador_entrada++ )
{
if( isalnum(buffer_entrada[contador_entrada]) || buffer_entrada[contador_entrada] == ':' || buffer_entrada[contador_entrada] == '\\' || buffer_entrada[contador_entrada] == '.' )
buffer_saida[contador_saida++] = buffer_entrada[contador_entrada];

contador_entrada++;
}

printf("Buffer de entrada: %s\n", buffer_entrada);
printf("Buffer de saida: %s\n", buffer_saida);

return 0;
}

A função "isalnum()", retorna "true" se o caracter for alfanumérico. E adicionei as demais comparações, que não são, porém, usa-se pra definir um path pra arquivo.

Estou considerando que o path seja pra windows.

EDIT:

Se quiser depurar pra ver os caracteres que estão vindo, faça-os mostrar em valor decimal, onde, cada valor será uma representação na tabela ascii.


for( contador_entrada = 0; contador_entrada < strlen(buffer_entrada); contador_entrada++ )
printf("Posicao %d - Valor decimal do caracter: %d\n", contador_entrada, buffer_entrada[contador_entrada] );

Postado
Um exemplo bem simples, usando a função "isalnum()", da biblioteca "ctypes.h".


int main(void)
{
char buffer_entrada[] = "Te ste.t xt";
char buffer_saida[1024] = {'\0'};
unsigned contador_entrada = 0;
unsigned contador_saida = 0;

for( contador_entrada = 0; contador_entrada < strlen(buffer_entrada); contador_entrada++ )
{
if( isalnum(buffer_entrada[contador_entrada]) || buffer_entrada[contador_entrada] == ':' || buffer_entrada[contador_entrada] == '\\' || buffer_entrada[contador_entrada] == '.' )
buffer_saida[contador_saida++] = buffer_entrada[contador_entrada];

contador_entrada++;
}

printf("Buffer de entrada: %s\n", buffer_entrada);
printf("Buffer de saida: %s\n", buffer_saida);

return 0;
}

A função "isalnum()", retorna "true" se o caracter for alfanumérico. E adicionei as demais comparações, que não são, porém, usa-se pra definir um path pra arquivo.

Estou considerando que o path seja pra windows.

EDIT:

Se quiser depurar pra ver os caracteres que estão vindo, faça-os mostrar em valor decimal, onde, cada valor será uma representação na tabela ascii.


for( contador_entrada = 0; contador_entrada < strlen(buffer_entrada); contador_entrada++ )
printf("Posicao %d - Valor decimal do caracter: %d\n", contador_entrada, buffer_entrada[contador_entrada] );

o ftell ainda está retornando -1 e o file também ainda está retornando NULL :\

Postado
Executou a rotina de depuração que postei?

Comparou, os códigos recebidos, com a tabela ASCII?

sim , pode me adicionar no facebook , é que aqui é lento para responder ,

O unico erro mesmo é que o fopen nao encontrou o arquivo :(

Postado

codigo:

if(strncmp(buffer,"download",8)==0){
memset(buffer,0,sizeof(buffer));
send(sock,"Digite o Local do arquivo:",strlen("Digite o Local do arquivo:"),0);
for(;;Sleep(1000)){
recv(sock,buffer,sizeof(buffer),0);
if(buffer==NULL||strcmp(buffer,"")==0||strcmp(buffer," ")==0){
memset(buffer,0,sizeof(buffer));

}else{break;}

}
char buffer_saida[1024]={'\0'};
for( contador_entrada = 0; contador_entrada < strlen(buffer); contador_entrada++ )
{
if( isalnum(buffer[contador_entrada]) || buffer[contador_entrada] == ':' || buffer[contador_entrada] == '\\' || buffer[contador_entrada] == '.' )
buffer_saida[contador_saida++] = buffer[contador_entrada];

contador_entrada++;
}
cout<<buffer_saida<<endl;
FILE *file = fopen(buffer_saida,"rb");
fseek(file,0,SEEK_END);
tamanho =ftell(file);
cout<<tamanho<<endl;
rewind(file);
memset(tam,0,sizeof(tam));
sprintf(tam,"%lu",tamanho);
char *dados=(char*)malloc(sizeof(char)*tamanho);
fread(dados,1,tamanho,file);
SOCKET sock2 = socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN conf2;
conf2.sin_addr.s_addr = inet_addr(IP);
conf2.sin_family = AF_INET;
conf2.sin_port = htons(5202);
for(;connect(sock2,(SOCKADDR*)&conf2,sizeof(conf2) )==SOCKET_ERROR;){Sleep(500);}
send(sock2,buffer,strlen(buffer),0);
Sleep(3000);
send(sock2,tam,strlen(tam),0);
Sleep(3000);
send(sock2,dados,tamanho,0);
Sleep(60000);
cout<<WSAGetLastError()<<endl;
fclose(file);
memset(buffer,0,sizeof(buffer));
free(dados);
closesocket(sock2);}

saida :

C\Dwlas\.x

4294967295 em unsigned long int , em int é -1

Postado
O depurador que postei acima, adicione ele após a função "recv()", e poste o resultado aqui no fórum.

tá ae !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

tem como você colocar esse for já no meu código

Postado

Precisará definir a variável "contador" com o tipo "int".

Segue o código com o depurador:


for(;; Sleep(1000))
{
recv(sock,buffer,sizeof(buffer),0);
[COLOR="Red"][B] for( contador = 0; contador < strlen(buffer); contador++ )
printf("Posicao %d - Caracter: %c (%d)\n", contador, buffer[contador], buffer[contador] );
[/B][/COLOR] if(buffer==NULL||strcmp(buffer,"")==0||strcmp(buff er," ")==0)
{
memset(buffer,0,sizeof(buffer));

}
else
{
break;
}

}

Postado
Precisará definir a variável "contador" com o tipo "int".

Segue o código com o depurador:


for(;; Sleep(1000))
{
recv(sock,buffer,sizeof(buffer),0);
[COLOR="Red"][B] for( contador = 0; contador < strlen(buffer); contador++ )
printf("Posicao %d - Caracter: %c (%d)\n", contador, buffer[contador], buffer[contador] );
[/B][/COLOR] if(buffer==NULL||strcmp(buffer,"")==0||strcmp(buff er," ")==0)
{
memset(buffer,0,sizeof(buffer));

}
else
{
break;
}

}

saída :

Caminho que coloquei : C:\\Downloads\\a.exe

Posição 0 - Caracter: C (67)

.

.

.

Posião 20 - Caracter: vazio

Postado

O depurador, como o próprio nome já diz, é pra depurar. Ele vai mostrar os dados a serem analisados. É exatamente esses dados que preciso.

Se você não quer mostrar as informações, tudo bem. Porém, apenas avise, ao invés de mostrar a saída das informações dessa maneira

Volto a repetir o que falei no post anterior (#10), onde tem um link pra uma página que contem a tabela ASCII.

Compare os valores decimais da saída do código (aqueles entre "()") com os da tabela, e confira se tem algum caracter indevido no meio.

Você está usando "strlen()" ou "sizeof()" pra definir o tamanho no momento do envio?

Conferiu se no recebimento, existe o terminador de string no buffer?

Postado
O depurador, como o próprio nome já diz, é pra depurar. Ele vai mostrar os dados a serem analisados. É exatamente esses dados que preciso.

Se você não quer mostrar as informações, tudo bem. Porém, apenas avise, ao invés de mostrar a saída das informações dessa maneira

Volto a repetir o que falei no post anterior (#10), onde tem um link pra uma página que contem a tabela ASCII.

Compare os valores decimais da saída do código (aqueles entre "()") com os da tabela, e confira se tem algum caracter indevido no meio.

Você está usando "strlen()" ou "sizeof()" pra definir o tamanho no momento do envio?

Conferiu se no recebimento, existe o terminador de string no buffer?

o ultimo array estava vazio :unsure:

foi o que escrevi em cima resumindo !!!!!!!!!!!!!!!!!!!!!!

Postado

O envio está sendo feito em C?

Se for, adicionou "\\\\" (4 contra-barras) na hora de enviar?

Quando envia apenas "\\", uma delas será retirada pelo próprio programa, pois ele considera como código de tratamento, enviando apenas "\".

O programa recebendo apenas "\", ele vai considerar como código de tratamento "\".

Postado
O envio está sendo feito em C?

Se for, adicionou "\\\\" (4 contra-barras) na hora de enviar?

Quando envia apenas "\\", uma delas será retirada pelo próprio programa, pois ele considera como código de tratamento, enviando apenas "\".

O programa recebendo apenas "\", ele vai considerar como código de tratamento "\".

enviei duas barras --------------------------------------------

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!