网络服务器程序,connect,accept,报错 Bad address

 

转自 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
#include
#include
#include
#include
#include

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

再次感谢大家!

你可能感兴趣的:(网络编程)