2012-01-06 28 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

相关问题