转自 http://www.linuxforum.net/forum/printthread.php?Cat=&Board=program&main=447775&type=thread
|
wohao2000 (journeyman) 03-10-09 21:12 |
尝试编写一个网络服务器程序,当客户端connect时,总是提示:Bad address | |
编写了个服务器程序,先创建一个socket,再bind,再listen,然后accept,但是当客户端试图connect时,总是报错:bad address。 可以肯定不是客户端程序的问题,因为我试图用telnet ip port的方法时,仍然出现这个错误,请问为什么呀。。 |
lml0 (newbie) 03-10-09 22:19 |
Re: 尝试编写一个网络服务器程序,当客户端connect时,总是提示:Bad address | |
把程序贴出来看看. |
teawater (veteran) 03-10-09 22:58 |
Re: 尝试编写一个网络服务器程序,当客户端connect时,总是提示:Bad address | |
在别的机器上连这个地址看一下成不成?我估计是你IP什么的弄错了或者网络配置有问题 |
dl_dht (member) 03-10-10 20:30 |
Re: 尝试编写一个网络服务器程序,当客户端connect时,总是提示:Bad address | |
struct sockaddr_in client; .... accept(fd, (struct sockaddr *)&client, NULL) ..... 这样使用可以出 "bad address" 这样的错误. 请检查一下你的服务器程序是否有类似的错误. |
wohao2000 (journeyman) 03-10-11 13:44 |
Re: 尝试编写一个网络服务器程序,当客户端connect时,总是提示:Bad address | |
我的服务器端程序时这样的: #include <sys/socket.h> #include <sys/types.h> #include <unistd.h> #include <netinet/in.h> #include <errno.h> #include <string.h> #define PORT 5600 int main() { int sockfd,newfd,ret; struct sockaddr_in listenaddr; struct sockaddr_in clientaddr; pid_t pid; int i=0; sockfd=socket(AF_INET,SOCK_STREAM,0); if(sockfd<0){ perror("create socket error"); exit(1); } listenaddr.sin_family=AF_INET; listenaddr.sin_port=htons(PORT); listenaddr.sin_addr.s_addr=htonl(INADDR_ANY); bzero(&(listenaddr.sin_zero),8); ret=bind(sockfd,(struct sockaddr *)&listenaddr,sizeof(struct sockaddr)); if(ret<0){ perror("bind error"); exit(1); } ret=listen(sockfd,127); if(ret<0){ perror("listen error"); exit(1); } while(1){ newfd=accept(sockfd,(struct sockaddr *)&clientaddr,(int *)sizeof(struct sockaddr)); if(newfd<0){ strerror(errno); printf("errno is %d\n",errno); perror("accept error"); //printf("i=%d\n",i); close(sockfd); exit(1); } if((pid=fork())==0){ close(sockfd); i=i+1; printf(":::now i received NO. %d request.:::\n",i); exit(0); }else close(newfd); } printf("::::Game Over::::\n"); } 我觉得肯定是服务器端出现了问题,因为我就在其他机器上用telnet都出现同样的问题 |
wohao2000 (journeyman) 03-10-11 13:45 |
Re: 尝试编写一个网络服务器程序,当客户端connect时,总是提示:Bad address | |
请问你如何避免这个错误? |
lml0 (newbie) 03-10-11 16:37 |
Re: 尝试编写一个网络服务器程序,当客户端connect时,总是提示:Bad address | |
把这一行 newfd=accept(sockfd,(struct sockaddr *)&clientaddr,(int *)sizeof(struct sockaddr)); 修改为: newfd = accept(sockfd, NULL, NULL); 或者 在程序中再多声明一个变量,比如: int len; 并且 len = sizeof(struct sockaddr); 然后把这一行 newfd=accept(sockfd,(struct sockaddr *)&clientaddr,(int *)sizeof(struct sockaddr)); 修改为: newfd = accept(sockfd, (struct sockaddr *)&clientaddr, &len); 你试试看行不行. |
wohao2000 (journeyman) 03-10-11 16:50 |
Re: 尝试编写一个网络服务器程序,当客户端connect时,总是提示:Bad address | |
多谢多谢, 我已经找到问题的原因了,错误就出现在: newfd=accept(sockfd,(struct sockaddr *)&clientaddr,(int *)sizeof(struct sockaddr)); 应该改为: size_t size=sizeof(struct sockaddr); newfd=accept(sockfd,(struct sockaddr *)&clientaddr,&size); 问题就解决了。 我在写accept函数时,是参照《linux函数库参考手册》,它上面写的accept的原型是: int accept(int s, struct sockaddr * addr , int * addrlen);有误导嫌疑,我就是按照这个写的,结果死都不知道为什么错了。 后来参照man手册,发现accept的原型为: int accept(int s, struct sockaddr *addr, socklen_t *addrlen); 55555555555555555~~~~,我真是欲哭无泪呀。。。 再次感谢大家! |