日期:2014-05-16  浏览次数:20620 次

关于select的问题
我按照书上的select的例子写了一个服务器端的程序,代码如下:
#define CONN_FD_MAX 50
#define BACKLOG 10
#define PORT 36195

struct conn_queue{
int navail;
int lfd;
struct conn_info{
int fd;
int sd;
}ci[CONN_FD_MAX];

};

void read_req(struct conn_queue *cq,int i);
void write_resp(struct conn_queue *cq,int i);
void accept_conn(struct conn_queue * cq);
int main()
{
struct conn_queue cq;
struct sockaddr_in addr;
fd_set wds,rds;
int maxfd;
char buf[1024];
int i,nsel;
cq.lfd=socket(AF_INET,SOCK_STREAM,0);
if(cq.lfd<0)
{
printf("socket error");
exit(1);
}
bzero(&addr,sizeof(addr));
addr.sin_family=AF_INET;
addr.sin_port=htons(PORT);
addr.sin_addr.s_addr=htonl(INADDR_ANY);
i=1;
setsockopt(cq.lfd,SOL_SOCKET,SO_REUSEADDR,&i,sizeof(i));
i=fcntl(cq.lfd,F_GETFL,0);
fcntl(cq.lfd,F_SETFL,i|O_NONBLOCK);
if(bind(cq.lfd,(struct sockaddr *)&addr,sizeof(addr))<0)
{
printf("bind error\n");
exit(1);
}
if(listen(cq.lfd,BACKLOG)<0)
{
printf("listen error\n");
exit(1);
}
FD_ZERO(&rds);
FD_ZERO(&wds);
for(i=0;i<CONN_FD_MAX;i++)
{
cq.ci[i].fd=-1;
cq.ci[i].sd=-1;
}
cq.navail=CONN_FD_MAX;
for(;;)
{
maxfd=0;
if(cq.navail>0)
{
FD_SET(cq.lfd,&rds);
maxfd=cq.lfd;
printf("FD_SET(socket)\n");
}
for(i=0;i<CONN_FD_MAX;i++)
{
if(cq.ci[i].sd>0){
if(cq.ci[i].fd>0)
FD_SET(cq.ci[i].fd,&wds);
else
FD_SET(cq.ci[i].fd,&rds);
maxfd=maxfd>cq.ci[i].fd?maxfd:cq.ci[i].fd;
printf("The maxfd is:%d\n",maxfd);
}
}
nsel=select(maxfd+1,&rds,&wds,NULL,NULL);
printf("The nsel is:%d\n",nsel);
if(FD_ISSET(cq.lfd,&rds))
{
accept_conn(&cq);
nsel--;

}
for(i=0;i<CONN_FD_MAX&&nsel>0;i++)
{
if(FD_ISSET(cq.ci[i].sd,&rds))
{
read_req(&cq,i);
nsel--;
}
if(FD_ISSET(cq.ci[i].sd,&wds))
{
write_resp(&cq,i);
nsel--;
}
}
printf("another circle\n");
}
}
但是用另一个客户端程序来连接的时候,虽然连接上了,但是结果是这样的:
FD_SET(socket)
the nsel is:1
connect succ ,the socketid is:4
another circle
FD_SET(socket)
段错误
哪位高手能给看看是哪里有错误啊,我新手,这段代码运行的具体流程还不是特别清楚,希望高手们能帮忙解答一下,谢谢了!!


------解决方案--------------------
楼主从你的打印信息来看,应该是
if(cq.ci[i].fd>0)
FD_SET(cq.ci[i].fd,&wds);
else
FD_SET(cq.ci[i].fd,&rds);

这两句出现了问题,又因为是段错误

很可能是fd_set中第一个参数有问题了