问题描述
- 用socket写了个linux聊天的小程序,一客户端一直输出接受消息成功 ==
-
//服务器端代码 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<errno.h> #include<sys/socket.h> #include<netinet/in.h> #include<arpa/inet.h> #include<malloc.h> #define MAXBUF 1024 int main() { int pid; int sockfd,new_fd; socklen_t len; struct sockaddr_in my_addr, their_addr; unsigned int myport,listnum; char buf[MAXBUF+1]; myport=7575; listnum=5; if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1){ perror("socker"); exit(EXIT_FAILURE); } memset(&my_addr,0,sizeof(my_addr)); my_addr.sin_family=AF_INET; my_addr.sin_port=htons(myport); my_addr.sin_addr.s_addr=inet_addr("192.168.1.106"); if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))==-1){ perror("bind"); exit(EXIT_FAILURE); } if(listen(sockfd,listnum)==-1){ perror("listen"); exit(EXIT_FAILURE); } printf("wait for connectn"); len=sizeof(struct sockaddr); if(new_fd=accept(sockfd,(struct sockaddr *)&their_addr,&len)==-1){ perror("accept"); exit(EXIT_FAILURE); } else printf("server:got conection!"); if((pid=fork())==-1){ perror("fork"); exit(EXIT_FAILURE); } else if(pid==0){ while(1){ memset(buf,0,sizeof(buf)); fgets(buf,MAXBUF,stdin); if(!strncasecmp(buf,"quit",4)){ printf("i will close the connection"); break; } len=send(new_fd,buf,strlen(buf)-1,0); if(len<0){ printf("message send failed!"); break; } } } else{ while(1){ bzero(buf,MAXBUF+1); len=recv(new_fd,buf,MAXBUF,0); if(len>0) printf("message recv successful:%s n",buf); else if(len<0){ printf("recv failed!"); break; } else{ printf("the other one close quit n"); break; } } } close(new_fd); close(sockfd); return 0; } //客户端的代码 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/socket.h> #include<errno.h> #include<netinet/in.h> #include<resolv.h> #include<unistd.h> #include<arpa/inet.h> #define MAXBUF 1024 int main() { int sockfd,len,destport=7575; struct sockaddr_in dest; char buf[MAXBUF+1]; if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0){ perror("socket"); exit(errno); } printf("socket createdn"); memset(&dest,0,sizeof(dest)); dest.sin_family=AF_INET; dest.sin_port=htons(destport); dest.sin_addr.s_addr=inet_addr("192.168.1.106"); if((connect(sockfd,(struct sockaddr *)&dest,sizeof(dest)))==-1){ perror("connect"); exit(errno); } printf("server connected!n"); pid_t pid; if((pid=fork())==-1){ perror("fork"); exit(errno); } else if(pid==0){ while(1){ memset(buf,0,sizeof(buf)); len=recv(sockfd,buf,MAXBUF,0); if(len>0) printf("recv successful:%s n",buf); else if(len<0){ perror("recv"); exit(errno); } else{ printf("the other one close ,quitn"); break; } } } else{ while(1){ memset(buf,0,sizeof(buf)); printf("pls send message to send:"); fgets(buf,MAXBUF,stdin); if(!strncasecmp(buf,"quit",4)){ printf("i will quitn"); break; } len=send(sockfd,buf,strlen(buf)-1,0); if(len<0){ perror("send"); break; } } } close(sockfd); return 0; }
客户端:
不知道这是什么情况呢,==
解决方案
有两个问题:
- 你bind之后没有调用Listen函数
socklen_t
是无符号整型,你用socklen_t len
这个变量去存储recv的返回值,然后又判断它是否大于0,结果就是:返回值为-1,但判断结果会认为这是个正数,所以accept、recv看起来都成功了,你的程序就到死循环里去了。其实你accept的时候就失败了,因为之前没调用listen函数。
解决方案二:
你这个服务器端代码跟你执行的程序对不上吧?
message recv successful这样的字眼没见你服务器端代码里有啊,你仔细对照一下你的程序是不是你那份代码编译出来的?或者还是你改了代码没重新编译。
时间: 2024-09-11 08:45:53