Ir ao conteúdo

Posts recomendados

Postado

Eu estou criando uma aplicação cliente/servidor em C no ubuntu. O propósito é bem simples, saber se vale mais a pena alugar ou vender um imóvel, o usuário digita o valor do aluguel, os meses que irá alugar e o valor que irá vender e o servidor faz as contas e devolve o resultado. Tudo está dentro de um do while para ficar infinito, no final o usuário digita CONTINUAR para testar outros valores e SAIR para encerrar a conexão. Mas está com um problema que não consigo identificar. A primeira vez que comparamos valores, o servidor retorna o resultado correto(alugar ou vender), porém a partir da segunda vez ao digitar CONTINUAR, ele sempre retorna resultados errados. Eu suspeito que esteja armazenando dados na variáveis erradas a partir da segunda vez, coloquei uns prints no meio do código para mostrar os valores e tem

divergência.E também tentei zerar as variáveis no começo e usar vários bzero e fflush, mas sem resultado. Mas não tenho certeza de nada. Podem me ajudar?

 

Código do cliente:

 

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <string.h>

int main ()
{
	struct sockaddr_in sock;
	int con, sockid,numbytes;
	char resposta[10];
	char buf[100];
	char aluguel[10];
	char venda[10];
	char meses[2];
	sockid = socket(AF_INET, SOCK_STREAM, 0);

	bzero(&(sock),sizeof(sock));

	sock.sin_family = AF_INET;
	sock.sin_port = htons(9012);
	inet_pton(AF_INET, "127.0.0.1",&sock.sin_addr);
	
	con=connect(sockid,(struct sockaddr*)&sock,sizeof(sock));
	do{
	if(con>=0)
	{
	printf("=====================================================\n");
	printf("Descubra se vale a pena vender ou alugar seu imóvel\n");
	printf("=====================================================\n");
	printf("Digite por quanto voce quer alugar: \n");
	scanf("%s", &aluguel);

	printf("=====================================================\n");

	if(send(sockid,aluguel,strlen(aluguel),0)==-1)
		{
			printf("Erro ao enviar mensagem\n");
			close(sockid);
		}
	printf("Digite por quantos meses ira alugar : \n");
	scanf("%s", &meses);

	printf("=====================================================\n");

	if(send(sockid,meses,strlen(meses),0)==-1)
		{
			printf("Erro ao enviar mensagem\n");
			close(sockid);
		}
	printf("Digite por quanto quer vender: \n");
	scanf("%s", &venda);

	printf("=====================================================\n");

	if(send(sockid,venda,strlen(venda),0)==-1)
		{
			printf("Erro ao enviar mensagem \n");
			close(sockid);
		}


	bzero(&buf,sizeof(buf));
	if((numbytes=recv(sockid,buf,100,0)==-1))
		{
			printf("Erro ao receber a mensagem\n");
		}

	printf("Vale mais a pena: %s\n",buf);
	printf("Digite SAIR para sair ou CONTINUAR para continuar a comparar.\n");
	scanf("%s",&resposta);
	fflush(stdin);
	if(send(sockid,resposta,strlen(resposta),0)==-1)
		{
			printf("Erro ao enviar mensagem\n");
			close(sockid);
		}

	if(strcmp(resposta,"CONTINUAR")==0)
			{
				continue;
			}

		}
	}while(strcmp(resposta,"SAIR")!=0);
	close(sockid);

}

 

Código do servidor:

 

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <string.h>

int main ()
{
	int sockid;
	struct sockaddr_in servidor;
	int client,numbytes;
	float convertido;
	float convertido1;
	float convertido2;
	char passar[10];
	char buf[100];
	char buf1[100];
	char buf2[100];
	float resultado;
	char resposta[10];


	sockid = socket(AF_INET, SOCK_STREAM,0);
	if(sockid==-1)
	{
		printf("Não foi possivel criar o socket");
		exit(1);
	}

	servidor.sin_family= AF_INET;
	servidor.sin_addr.s_addr = htonl(INADDR_ANY);
	servidor.sin_port = htons(9012);

	if(bind(sockid,(struct sockaddr*)&servidor, sizeof(servidor))<0)
	{
		printf("Falhou ao associar a porta\n");
	}

	listen(sockid, 3);
	int c, new_socket;

	while(1)
	{
		c = sizeof(struct sockaddr_in);
		new_socket = accept(sockid, (struct sockaddr *)&client,(socklen_t *)&c);

		if(new_socket <=0)
		{
			printf("Falhou ao aceitar o conector\n");
			continue;
		}

			while(1){
			printf("Conexão aceita\n");
			fflush(stdin);
			resultado = 0;
			convertido = 0;
			convertido1 = 0;
			convertido2 = 0;
			bzero(&buf,sizeof(buf));
			if((numbytes=recv(new_socket,buf,100,0)==-1))
			{
				printf("Erro ao receber a mensagem\n");
			}

			convertido = atof(buf);
			

			bzero(&buf1,sizeof(buf1));
			if((numbytes=recv(new_socket,buf1,100,0)==-1))
			{
				printf("Erro ao receber mensagem\n");
			}
			convertido1 = atof(buf1);
			printf(buf1);
			

			bzero(&buf2,sizeof(buf2));
			if((numbytes=recv(new_socket,buf2,100,0)==-1))
			{
				printf("Erro ao receber mensagem\n");
			}
			convertido2 = atof(buf2);
			printf(buf2);
			


			resultado = convertido*convertido1;

			if(resultado>convertido2)
			{
			sprintf(passar, "Alugar");
			}
			else
			{
			sprintf(passar,"Vender");
			}
			if(send(new_socket,passar,strlen(passar),0)==-1)
				{
					printf("Erro ao enviar a mensagem\n");
					close(new_socket);

				}
			bzero(&resposta,sizeof(resposta));
				if((numbytes=recv(new_socket,resposta,strlen(resposta),0)==-1))
				{
				printf("Erro ao receber a mensagem\n");
				}
				fflush(stdin);
		if(strcmp(resposta,"SAIR")==0)
				{
				
					close(new_socket);
					break;
					
				}
		
			}
	}

}

 

  • 3 semanas depois...
Postado

Caso você queira fazer isso com sizeof faça:

sizeof(arr)/sizeof(arr[0])

Pesquisa porque funciona assim . . . E não do outro jeito


OBS1:

Citação

 

 - void bzero(void *s, size_t n);

- The bzero() function erases the data in the n bytes of the memory starting at the location pointed to by s, by writing zeros (bytes containing '\0') to that area.

 

OBS2:
1088807751_Screenshotfrom2019-06-2701-25-20.png.30d3e238a2f2a06d0819a5a3d198d84b.png

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!