Jump to content
WizardTech

Cliente/Servidor em C - Problemas

Recommended Posts

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

}

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By Thiago Hartmann
      Olá a todos!
      Sou iniciante em C, estou cursando o 1º semestre em ads na faculdade, estou fazendo um trabalho onde preciso elaborar um software para uma pizzaria, contendo cardápio, preço dos produtos, login e etc...

      estou com um problema em relação ao cardápio, onde não sei como somar os valores dos itens escolhidos pelo "cliente" através do cardápio se puderem me ajudar em relação a como colocar os preços referentes a cada produto para que eles somem automaticamente quando o cliente escolher o que deseja, pois não sei se devo fazer como constantes globais, ou uma função específica para isso.
       
      Obrigado!
       
      #include <stdio.h> #include <stdlib.h> #include <locale.h> #include <conio.h> void entrada (){ printf ("*************************************\n"); printf ("**** Bem Vindo ****\n"); printf ("**** a ****\n"); printf ("**** UNIPIZZA ****\n"); printf ("*************************************\n"); } int menu (){ int op; printf (" \nCardápio \n\n"); printf ("1 - Pizzas. \n"); printf ("2 - Bebidas. \n"); printf ("3 - Finalizar o pedido.\n"); printf ("Digite a opção desejada: \n"); scanf("%d", &op); getch()-48; printf ("\n"); ; return op; } int controladorapizza (int op) { int oppizza, m, c, fc,qq, p; printf ("\n1 - Pizza Mussarela - 18,00 R$ \n"); printf ("2 - Pizza Calabresa - 18,00 R$ \n"); printf ("3 - Pizza Franco com Catupiry - 18,00 R$ \n"); printf ("4 - Pizza Quatro Queijos - 22,00 R$ \n"); printf ("5 - Pizza Portuguesa - 22,00 R$ \n"); printf ("Digite a opção desejada: \n"); scanf ("%d", &oppizza); switch (oppizza){ case 1: printf ("\nVocê adicionou pizza de Mussarela a sua bandeja!\n"); m = 18; break; case 2: printf ("\nVocê adicionou pizza de Calabresa a sua bandeja!\n"); c = 18; break; case 3: printf ("\nVocê adicionou pizza de Quatro Queijos a sua bandeja!\n"); qq = 22; break; case 4: printf ("\nVocê adicionou pizza de Portuguesa a sua bandeja!\n"); p = 22; break; default: printf ("\nValor incorreto, tente novamente\n"); break;} return oppizza; } int controladorabebida (int op) { int opbebida, s, sv, rl, rlv, r, rv; char str [10]; printf ("\n1 - Suco - 5,00 R$ \n"); printf ("2 - Refrigerante Lata - 4,00 R$\n"); printf ("3 - Refrigerante 2L - 13,00 R$\n"); printf ("Digite a opção desejada: \n"); scanf ("%d", &opbebida); switch (opbebida){ case 1: printf ("\nInforme o sabor do suco: \n"); scanf ("%s", &str); printf ("\nVocê adicionou suco de %s a sua bandeja!\n", str); sv = 5; break; case 2: printf ("\nInforme o refrigerante lata: "); scanf ("%s", &str); printf ("\nVocê adicionou %s lata a sua bandeja!\n", str); rlv = 4; break; case 3: printf ("\nInforme o refrigerante 2 Litros: "); scanf ("%s", &str); printf ("\nVocê adicionou %s 2 Litros a sua bandeja!\n", str); rv = 13; break; default: printf ("\nComando incorreto, tente novamente\n"); break;} return opbebida; } int main(){ setlocale(LC_ALL,""); int op,oppizza,opbebida, total; const int entrega = 5; entrada(); do{ op = menu(op); switch(op){ case 1: oppizza = controladorapizza(oppizza); break; case 2: opbebida = controladorabebida(opbebida); break; total = entrega+opbebida+oppizza; printf ("O total de seu pedido é: %d", total); } }while(op != 3 ); total = entrega+opbebida+oppizza; printf ("O total de seu pedido é: %d", total); printf("\n\n\n"); return 0; }  
    • By gabriel1303
      É possível verificar a ocorrência de um caractere em negrito em uma planilha do Excel utilizando c/c++?
    • By novo na programação
      O sistema consiste em ler os dados cadastrados (valores estáticos) de uma entrevista e
      fornecer as informações para as seguintes perguntas:
       
      1 - Quantidade de mulher e homens na área? (% de cada sexo)
      2 - Faixa etária? (Menor e maior idade por sexo). Criar um vetor idade para cada sexo.
      3 - Quem ganha mais? Homem ou Mulher? (Comparar médias de salários)
      4 - Quem é mais especializado? (Comparar quantidade com pós-graduação %)
       
      Ex1. Perguntas?
      Sexo (1- H, 2-M)
      Idade (?)
      Salário (?)
      Possui pós-graduação? (1-S, 2-N)

      Entrada (estática)

      Entrevistado 1
      Sexo = 1
      Idade = 19
      Salário = 4.000,00
      Possui pós-graduação = 2

      Entrevistado 2
      Sexo = 2
      Idade = 25
      Salário = 3.000,00
      Possui pós-graduação = 1

      Entrevistado 3
      Sexo = 1
      Idade = 18
      Salário = 5.000,00
      Possui pós-graduação = 2

      Entrevistado 4
      Sexo = 1
      Idade = 23
      Salário = 6.000,00
      Possui pós-graduação = 1 

      Entrevistado 5
      Sexo = 2
      Idade = 30
      Salário = 2.000,00
      Possui pós-graduação = 1

      SAÍDA
      1 - Quantidade de mulher e homens na área?
      60% homens e 40% mulheres
      2 - Faixa etária?
      homens (18-23) e mulheres (25-30)
      3 - Quem ganha mais? Homem ou Mulher?
      Homens (média 5.000,00) e Mulheres (média 2.500,00)
      4 - Quem é mais especializado?
      homens - 33% e mulheres - 100%
      Cálculo = qtdhomens com pós/qtdhomens *100
    • By samueloliveir
      Questão 1
      Crie um algoritmo que leia um número entre 2 e 20 e gere uma tela com a seguinte configuração:
       
      Digite um número:
      4
      Saída do algoritmo:
      1
      12
      123
      1234
      123
      12
      1
       
      Questão 2
      Escreva um algoritmo que calcule a média da seguinte sequência numérica a seguir: 1/2 + 1/3 + 1/4 + 1/5 + 1/6 + ... + 1/50. Feito isto, o algoritmo deverá apresentar uma lista contendo todos os números da sequencia que estão acima da média calculada.
       
      Questão 3
       
      Um posto está vendendo combustíveis com a seguinte tabela de descontos: Álcool: até 20 litros, desconto de 3% por litro e acima de 20 litros, desconto de 5% por litro; Gasolina: até 20 litros, desconto de 4% por litro e acima de 20 litros, desconto de 6% por litro. Escreva um algoritmo que leia o número de litros vendidos, o tipo de combustível (A-álcool, G-gasolina) e imprima o valor a ser pago pelo cliente. Considere que o preço do litro da gasolina é R$ 2,99 e o preço do litro do álcool é R$ 2,19. Usar procedimento.
       
      Questão 4
      Um número é, por definição, primo se ele não tem divisores, exceto 1 e ele próprio. Prepare um programa para ler um número inteiro positivo e determinar se ele é ou não um número primo. Usar função.
    • By joaoarj
      Estou com dificuldade para elaborar o seguinte código:
       
       

×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.