【发布时间】:2010-06-10 15:49:59
【问题描述】:
我已经使用 select() 在此服务器上工作了几天。它的作用是,我有两个客户端数组(一个是“供应商”,另一个是“消费者”),服务器的任务是检查供应商是否有东西要发送给消费者,并且如果是肯定的,发送它。
服务器的第二部分是,当消费者收到供应商的信息时,他们会向发送信息的同一供应商发送确认消息。
当客户端连接时,它会被识别为“未定义”,直到它发送一条带有单词“供应商”或“消费者”(西班牙语,因为我来自那里)的消息,当服务器将它放入正确的客户端数组。
好吧,服务器做什么在这里并不是很重要。重要的是,我用两个不同的“for”循环来完成这两个部分,这就是我遇到问题的地方。当第一个用户连接到服务器时(无论是供应商还是消费者),服务器都会卡在第一个或第二个循环中,而不是继续执行。因为这是我第一次使用 select(),所以我可能会遗漏一些东西。你们能帮我什么忙吗?
非常感谢。
for(;;)
{
rset=allset;
nready=select(maxfd+1,&rset,NULL,NULL,NULL);
if (FD_ISSET(sockfd, &rset))
{
clilen=sizeof(cliente);
if((connfd=accept(sockfd,(struct sockaddr *)&cliente,&clilen))<0)
{
printf("Error");
}
IP=inet_ntoa(cliente.sin_addr);
for(i=0;i<COLA;i++)
{
if(indef[i]<0)
{
indef[i]=connfd;
IPind[i]=IP;
break;
}
}
FD_SET(connfd,&allset);
if(connfd > maxfd)
{
maxfd=connfd;
}
if(i>maxii)
{
maxii=i;
}
if(--nready<=0)
{ continue; }
}// Fin ISSET(sockfd)
for(i=0;i<=maxii;i++)
{
if((sockfd1=indef[i])<0)
{ continue; } //!
if(FD_ISSET(sockfd1,&rset))
{
if((n=read(sockfd1,comp,MAXLINE))==0)
{
close(sockfd1);
FD_CLR(sockfd1,&allset);
indef[i]=-1;
printf("Cliente indefinido desconectado \n");
}
else
{
comp[n]='\0';
if(strcmp(comp,"suministrador")==0)
{
for(j=0;j<=limite;j++)
{
if(sumi[j]<0)
{
IPsum[j]=IPind[i];
sumi[j]=indef[i];
indef[i]=-1;
if(j>maxis)
{
maxis=j;
}
break;
}
}
}
else if(strcmp(comp,"consumidor")==0)
{
for(o=0;j<=limite;j++)
{
if(consum[o]<0)
{
IPcons[o]=IPind[i];
consum[o]=indef[i];
indef[o]=-1;
if(o>maxic)
{
maxic=o;
}
break;
}
}
}
if(--nready <=0)
{
break;
}
}
}
}//fin bucle for maxii
for(i=0;i<=maxis;i++)
{
if((sockfd2=sumi[i])<0)
{ continue; }
if(FD_ISSET(sockfd2,&rset))
{
if((n=read(sockfd2,buffer2,MAXLINE))==0)
{
close(sockfd2);
FD_CLR(sockfd2,&allset);
sumi[i]=-1;
printf("Suministrador desconectado \n");
}
else
{
buffer2[n]='\0';
for(j=0;j<=maxic;j++)
{
if((sockfd3=consum[j])<0)
{ continue; }
else
{
strcpy(final,IPsum[i]);
strcat(final,":");
strcat(final,buffer2);
write(sockfd3,final,sizeof(final));
respuesta[i]=1;
}
}
break; // ?
}
}
}//fin for maxis
for(i=miniic;i<=maxic;i++)
{
if((sockfd4=consum[i])<0)
{ continue; }
if(FD_ISSET(sockfd4,&rset))
{
if((n=read(sockfd4,buffer3,MAXLINE))==0)
{
close(sockfd4);
FD_CLR(sockfd4,&allset);
consum[i]=-1;
printf("Consumidor desconectado \n");
}
else
{
buffer3[n]='\0';
IP2=strtok(buffer3,":");
obj=strtok(NULL,":");
for(j=0;j<100;j++)
{
if((strcmp(IPsum[j],IP2)==0) && (respuesta[j]==1))
{
write(sumi[j],obj,sizeof(obj));
miniic=i+1;
respuesta[j]=0;
break;
}
}
}
}
}
【问题讨论】:
-
你的代码格式很糟糕。很多额外的空行。有时 { 括号与控制语句在同一行,有时则不在。有时你根本没有括号。改进编程的第一种方法是应用一致的格式。
-
我已根据更普遍接受的布局重新格式化您的代码。
标签: c sockets select client-server