2012-01-06 10 views
9

he hecho un programa simple que cambia una cadena de minúsculas a mayúsculas y de mayúsculas a minúsculas. El servidor funciona hasta el cliente de inicio, después de que el servidor de ejecución del cliente proporcione este error: "servidor de recitación fallita: El punto de conexión de transporte no está conectado" ¿por qué? Creo que la transmisión cerró demasiado pronto o no? continuación hay código de servidor:punto final de transporte no está conectado recv socket

#include <stdlib.h> 
    #include <stdio.h> 
    #include <unistd.h> 
    #include <sys/types.h> 
    #include <ctype.h> 
    #include <sys/socket.h> 
    #include <string.h> 
    #include <netinet/in.h> 
    #define MAXLENGTH 80 
    #define SERVERPORT 1313 


    void minuscolatore (int in,int out){ 
     char inputline[MAXLENGTH]; 
     int len,i; 
     while((len=recv(in,inputline,MAXLENGTH,0))>0){ 
      for(i=0;i<len;i++){ 
       inputline[i]=tolower(inputline[i]); 
      } 
      if (strcmp(inputline,"fine")==0){ 
       break; 
      } 
      send(out,inputline,len,0); 
     } 
    } 
    void maiuscolatore(int in,int out){ 
     char inputline[MAXLENGTH]; 
     int len,i; 
     while((len=recv(in,inputline,MAXLENGTH,0))>0){ 
      for(i=0;i<len;i++){ 
       inputline[i]=toupper(inputline[i]); 
      } 
      if (strcmp(inputline,"FINE")==0){ 
       break; 
      } 
      send(out,inputline,len,0); 
     } 
    } 
    int main(){ 
     int sock,client_len,fd; 
     char c; 
     struct sockaddr_in client, server = {AF_INET,htons(SERVERPORT),INADDR_ANY}; 
     if((sock=socket(AF_INET,SOCK_STREAM,0))==-1){ 
      perror("Socket fallita"); 
      exit(1); 
     } 
     if(bind(sock,(struct sockaddr *)&server,sizeof server)==-1){ 
      perror("Bind fallita"); 
      exit(2); 
     } 
     listen(sock,5); 
     while(1){ 
      client_len=sizeof(client); 
      if((fd=accept(sock,(struct sockaddr *)&client,&client_len))<0){ 
       perror("accept fallita"); 
       exit(3); 
      } 
      if (recv(sock,&c,1,0)==-1){ 
       perror("recv server fallita"); 
       exit(4); 
      } 
      if (c=='+'){ 
      switch(fork()){ 
       case -1: 
        perror("Fork fallita"); 
        exit(4); 
       case 0: 
        printf("Aperta connessione\n"); 
        send(fd,"Benvenuto al maiuscolatore, minuscolatore\n",27,0); 
        maiuscolatore(fd,fd); 
        printf("Chiusa connessione\n"); 
      } 
     } 
      else if (c=='-'){ 
      switch(fork()){ 
       case -1: 
        perror("Fork fallita"); 
        exit(4); 
       case 0: 
        printf("Aperta connessione\n"); 
        send(fd,"Benvenuto al maiuscolatore, minuscolatore\n",27,0); 
        minuscolatore(fd,fd); 
        printf("Chiusa connessione\n"); 
      } 
      } 
     } 
     close(fd); 
    } 

y después de cliente:

#include <stdlib.h> 
    #include <stdio.h> 
    #include <unistd.h> 
    #include <sys/types.h> 
    #include <ctype.h> 
    #include <sys/socket.h> 
    #include <string.h> 
    #include <netinet/in.h> 
    #define MAXLENGTH 80 
    #define SERVERPORT 1313 

    int main(){ 
     int sockfd; 
     struct sockaddr_in server={AF_INET,htons(SERVERPORT),INADDR_ANY}; 
     int i=0, len; 
     char buf[MAXLENGTH],c,d; 
     if ((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1){ 
      perror("socket fallita"); 
      exit(1); 
     } 
     if (connect(sockfd, (struct sockaddr *) &server,sizeof server)==-1){ 
      perror("connect fallita"); 
      exit(2); 
     } 
     printf("\nDigita una stringa :"); 
     while((c=getchar())!='\n' && i<MAXLENGTH) 
      buf[i++]=c; 

     buf[i]='\0'; 
     len=strlen(buf); 
     printf("\nScrivi + se vuoi tutto maiuscolo e - se vuoi tutto minuscolo:"); 
     d=getchar(); 
     if (send(sockfd,&d,1,0)==-1){ 
      perror("send d fallita"); 
      exit(4); 
     } 
     printf("\nInvio la stringa al server...\n"); 
     if(send(sockfd,buf,len,0)==-1){ 
      perror("send fallita"); 
      exit(4); 
     } 
     if(recv(sockfd,buf,len,0)>0){ 
      printf("Ho ricevuto la risposta: %s\n",buf); 
     } 
     else{ 
      perror("seconda receive fallita"); 
      exit(3); 
     } 
     close(sockfd); 
     exit(0); 
    } 

Respuesta

21

El fd de su accept es el identificador de archivo a partir de recv, no sock

+1

vencer a mi por 15s .. ;-) – alk

+1

Me ahorró mucho tiempo (y) – gkiko

Cuestiones relacionadas