socket accept error
linux下的server端编程,很简单,基本照抄apue:
int main(int argc, char** argv)
{
int servfd,clifd;
struct sockaddr_in servaddr,cliaddr;
if ((servfd = socket(AF_INET,SOCK_STREAM, 0 ))
{
printf( " create socket error!\n " );
exit( 1 );
}
bzero( & servaddr, sizeof (servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(SERVER_PORT);
servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
inet_aton("127.0.0.1", & servaddr.sin_addr);
int on=1;
if((setsockopt(servfd,SOL_SOCKET,SO_REUSEADDR ,&on,sizeof(on)))<0)
{
perror("setsockopt failed");
exit(EXIT_FAILURE);
}
if(bind(servfd,( struct sockaddr * ) & servaddr, sizeof (servaddr))
{
printf( " bind to port %d failure for %s\n " ,SERVER_PORT, strerror(errno));
exit( 1 );
}
if(listen(servfd,LENGTH_OF_LISTEN_QUEUE)
{
printf( " call listen failure!\n " );
exit( 1 );
}
while ( 1 )
{
socklen_t length = sizeof (cliaddr);
clifd = accept(servfd,( struct sockaddr * ) & cliaddr, & length);
if(clifd
{
printf( " error comes when call accept for %s!\n ", strerror(errno));
break ;
}
printf( " from client,IP:%s,Port:%d\n " ,inet_ntoa(cliaddr.sin_addr),ntohs(cliaddr.sin_port));
pid_t pid = 0;
if ((pid = fork()) == 0){
close(servfd);
str_echo(clifd);
}
else{
close(clifd);
}
} // exit
close(servfd);
return 0 ;
}
有client连接上之后,server端接受这个连接后fork一个进程处理,但接着就会来一个accept for Bad file descriptor!错误!
求解啊,为什么?
------解决方案--------------------
str_echo(clifd); 这一句出的问题吗?