Jump to content

Cliente/Servidor


Luís Barbas

Recommended Posts

Luís Barbas

Tenho uma ligaçao cliente/servidor que funciona localmente mas tou com umas dúvidas que não consigo resolver. O programa aceita me vários cliente de uma vez mas não permite fazer as operações em todos eles. E gostaria que a ligação inicializa-se com o start e terminasse com um end. É possível ajudarem-me ? o código é o seguinte:

 

///////////////Servidor////////////////////

#include<stdio.h>
#include<netinet/in.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netdb.h>
#include<stdlib.h>
#include<string.h>
#define MAX 80
#define SA struct sockaddr

//const int MAX_USERS = 5;
void error(char *msg)   //função para mostar erros
{
  perror(msg);
  exit(1);
}
void calculate(int sockfd)  //funçao da calculadora 
{
  char buff[MAX];
  int n;
  for(;;)
    {
      bzero(buff,MAX); //desocupa o buffer
      read(sockfd,buff,sizeof(buff)); //reading data from socket
      printf("Expressão do cliente: %s \n ",buff);
      static int i,size1=1,size2=1,opp;
      char *op1,*op2;
      op1=malloc(size1);
      op2=malloc(size1);
      for(i=0;i<strlen(buff);i++)
    {
      if(buff!='*' & buff!='/' & buff!='+' & buff!='-')
        {
          op1=(char)buff;
          size1++;
          op1=realloc(op1,size1);
        }
      else
        {
          int j,s=0;
          opp=i;
          for(j=i+1;j<strlen(buff);j++)
        {
          op2=(char)buff[j];
          size2++;
          op1=realloc(op1,size2);
          s++;
        }
          break;
        }
    }
      int opr1,opr2,result;
      opr1=atoi(op1); //converte a string para o inteiro
      opr2=atoi(op2);
      if(buff[opp]=='*')
    {
      result=opr1*opr2;
      bzero(buff,MAX);
      snprintf(buff,10,"%d",result);
          printf("Resultado: %s",buff);
          write(sockfd,buff,sizeof(buff)); //escrever o resultado no buffer
      fprintf(stderr,"A enviar o resultado a partir do servidor : %s\n : ",buff);
    }
      else if(buff[opp]=='/')
    {
      result=opr1/opr2;
      bzero(buff,MAX);
      snprintf(buff,10,"%d",result);
          write(sockfd,buff,sizeof(buff)); //escrever o resultado no buffer
      fprintf(stderr,"A enviar o resultado a partir do servidor .Resultado : %s :\n ",buff);
    }
      else if(buff[opp]=='+')
    {
      result=opr1+opr2;
      bzero(buff,MAX);
      snprintf(buff,10,"%d",result);
          write(sockfd,buff,sizeof(buff)); //escrever o resultado no buffer
      fprintf(stderr,"A enviar o resultado a partir do servidor .Resultado : %s : \n",buff);   
    }
      else if(buff[opp]=='-')
    {
      result=opr1-opr2;
      bzero(buff,MAX);
      snprintf(buff,10,"%d",result);
          write(sockfd,buff,sizeof(buff)); //escrever o resultado no buffer
      fprintf(stderr,"A enviar o resultado a partir do servidor .Resultado : %s : \n",buff);
    }
     else
    {
      write(sockfd,"Expressão invalida.Tente outra vez\n",29);
    }
      if(strncmp("exit",buff,4)==0)
    {
      printf("Server Exit...\n");
      break;
    }
    }
}


int main(int argc,char *argv[])
{
  int sockfd,connfd,len,pid;
  struct sockaddr_in servaddr,cli;
 
  sockfd=socket(AF_LOCAL,SOCK_STREAM,0); //criação do socket
  if(sockfd==-1)
    {
      printf("socket creation failed...\n");
      exit(0);
    }
  else
    printf("Socket successfully created..\n");
  bzero(&servaddr,sizeof(servaddr));
  servaddr.sin_family=AF_LOCAL;
  if((bind(sockfd,(SA*)&servaddr, sizeof(servaddr)))!=0)    // conecta o endereço com o socket
    {
      printf("socket bind failed...\n");
      exit(0);
    }
  else
    printf("Socket successfully binded..\n");
  if((listen(sockfd,5))!=0) //socket esta pronto para receber qualquer cliente novo
    {
      printf("Listen failed...\n");
      exit(0);
    }
  else
  printf("Server listening..\n");
  len=sizeof(cli);
  for(;;)
    {
     connfd=accept(sockfd,(SA *)&cli,&len);//socket vai aceitar qualquer cliente novo
  if(connfd<0)
    {
      printf("server acccept failed...\n");
      exit(0);
    }
  else
    printf("server acccept the client...\n");
  if((pid==fork())==0)
    calculate(connfd);
  else
    close (connfd);
    }
  close(sockfd);//fecha o socket criado
}

////////////////////////Cliente///////////////////////

 

#include<stdio.h>
#include<netinet/in.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netdb.h>
#include<string.h>
#include<stdlib.h>
#define MAX 80
#define SA struct sockaddr
void error(char *msg)
{
  perror(msg);
  exit(1);
}
void calcy(int sockfd)
{
  char buff[MAX];
  int n;

  

  for(;;)
    {
      bzero(buff,sizeof(buff));
      printf("\nIntroduza a expressão: ");
      n=0;
      while((buff[n++]=getchar())!='\n');
      write(sockfd,buff,sizeof(buff)); //utilizador escreve a expressão no socket

      bzero(buff,sizeof(buff));//desocupa o buffer
      read(sockfd,buff,sizeof(buff));//le resultado do socket
      printf("Resultado: %s ",buff);
      if((strncmp(buff,"exit",4))==0)
    {
      printf("Client Exit...\n");
      break;
    }
  
}
}
int main(int argc,char *argv[])
{
  int sockfd;
  struct sockaddr_in servaddr,cli;
  sockfd=socket(AF_LOCAL,SOCK_STREAM,0); //cria o socket
  if(sockfd==-1)
    {
      printf("socket creation failed...\n");
      exit(0);
    }
  else
    printf("Socket successfully created..\n");
  bzero(&servaddr,sizeof(servaddr));
  servaddr.sin_family=AF_LOCAL;//socket LOCAL
 (connect(sockfd,(SA *)&servaddr,sizeof(servaddr))!=0);//conexão ao servidor
   
      calcy(sockfd);//chama a funçao da calculadora
  
  
  printf("connected to the server..\n");
 
  close(sockfd);//fecha o socket
}

  

 

Edited by M6
Formatação do código.
Link to post
Share on other sites

Tens de colocar as tuas dúvidas de forma clara e concreta, uma de cada vez.
Sinceramente não consegui perceber nenhuma das questões que colocaste...

10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Link to post
Share on other sites
Luís Barbas

Têm razão. Este programa é uma calculadora. Eu executo o programa em linux pelo terminal. Eu executo o servidor e este fica à espera que o cliente entre e digite uma operação para ele calcular. A minha dúvida é que me aceita vários clientes mas apenas permite que o primeiro use a calculadora. Por exemplo, eu executo o servidor, depois um cliente e até consigo executar outro cliente noutro terminal. Se enviar a operação a realizar do primeiro cliente, o servidor envia de volta o resultado. Se tentar enviar a operação com o segundo cliente, ela não é resolvida. Queria ajuda para que qualquer cliente que executasse pudesse enviar e receber a operação do servidor.

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
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.