Luís Barbas Posted June 22, 2018 at 12:45 AM Report #611079 Posted June 22, 2018 at 12:45 AM 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 }
M6 Posted June 22, 2018 at 09:13 AM Report #611081 Posted June 22, 2018 at 09:13 AM 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."
HappyHippyHippo Posted June 22, 2018 at 11:14 AM Report #611083 Posted June 22, 2018 at 11:14 AM eu também fiquei na dúvida do que realmente é pedido aqui IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Luís Barbas Posted June 22, 2018 at 11:48 AM Author Report #611084 Posted June 22, 2018 at 11:48 AM 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.
HappyHippyHippo Posted June 24, 2018 at 01:23 PM Report #611099 Posted June 24, 2018 at 01:23 PM A ver o código, parece que estás a fechar o socket quando determinas que o thread é o pai após o fork IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now