2012-01-06 57 views
9

我已經做了一個簡單的程序,將字符串從小寫更改爲大寫,並將大小寫從大寫更改爲小寫。 服務器工作到開始客戶端,客戶端運行服務器後出現此錯誤: 「recv server fallita:傳輸端點未連接」 爲什麼?我認爲那個流很快就關閉了? 下面有服務器的代碼:傳輸端點未連接RECOV套接字

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

和客戶端後:

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

回答

21

fdaccept是文件句柄recv從,不sock

+1

打我的15秒.. .--) – alk 2012-01-06 16:12:26

+1

爲我節省了很多時間(y) – gkiko 2013-10-07 21:55:26