2012-01-06 38 views
9

Tôi đã thực hiện một chương trình đơn giản thay đổi chuỗi từ chữ thường sang chữ hoa và từ chữ hoa sang chữ thường. Máy chủ hoạt động cho đến khi khách hàng bắt đầu, sau khi máy chủ khách chạy cung cấp lỗi này: "recv server fallita: Điểm cuối giao thông không được kết nối" tại sao? tôi nghĩ rằng luồng đóng cửa quá sớm hay không? dưới đây có mã của máy chủ:điểm cuối giao thông không được kết nối ổ cắm recv

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

và sau khi khách hàng:

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

Trả lời

21

Các fd từ accept của bạn là xử lý tập tin để recv từ, không sock

+1

đánh bại tôi bằng cách 15s .. . ;-) – alk

+1

Đã lưu tôi rất nhiều thời gian (y) – gkiko

Các vấn đề liên quan