我做了一个简单的程序,将一个字符串从小写改为大写,从大写改为小写.
服务器工作直到启动客户端后,客户端运行服务器发出此错误:
“recv server fallita:传输端点未连接”
为什么?我认为流关闭太快了吗?
下面有代码服务器:
服务器工作直到启动客户端后,客户端运行服务器发出此错误:
“recv server fallita:传输端点未连接”
为什么?我认为流关闭太快了吗?
下面有代码服务器:
#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,len,0); } } void maiuscolatore(int in,0))>0){ for(i=0;i<len;i++){ inputline[i]=toupper(inputline[i]); } if (strcmp(inputline,"FINE")==0){ break; } send(out,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,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,INADDR_ANY}; int i=0,len; char buf[MAXLENGTH],c,d; if ((sockfd=socket(AF_INET,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,0)==-1){ perror("send d fallita"); exit(4); } printf("\nInvio la stringa al server...\n"); if(send(sockfd,buf,0)==-1){ perror("send fallita"); exit(4); } if(recv(sockfd,0)>0){ printf("Ho ricevuto la risposta: %s\n",buf); } else{ perror("seconda receive fallita"); exit(3); } close(sockfd); exit(0); }
解决方法
从你的接受的fd是recv的文件句柄,而不是sock