wohao2000(journeyman)

03-10-09 21:12


编写了个服务器程序,先创建一个socket,再bind,再listen,然后accept,但是当客户端试图connect时,总是报错:bad address。

可以肯定不是客户端程序的问题,因为我试图用telnet ip port的方法时,仍然出现这个错误,请问为什么呀。。

lml0(newbie)

03-10-09 22:19


把程序贴出来看看.

teawater


(veteran)

03-10-09 22:58


在别的机器上连这个地址看一下成不成?我估计是你IP什么的弄错了或者网络配置有问题

dl_dht(member)

03-10-10 20:30


struct sockaddr_in client;
 .... 
 accept(fd, (struct sockaddr *)&client, NULL) 
 .....


这样使用可以出 "bad address" 这样的错误. 请检查一下你的服务器程序是否有类似的错误.

wohao2000(journeyman)

03-10-11 13:44


我的服务器端程序时这样的:

#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


请问你如何避免这个错误?

lml0(newbie)

03-10-11 16:37


把这一行 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


多谢多谢,

我已经找到问题的原因了,错误就出现在:

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~~~~,我真是欲哭无泪呀。。。

再次感谢大家!

尝试编写一个网络服务器程序,当客户端connect时,总是提示:Bad address