首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Unix ipc服务器在一个客户端停止后停止

Unix ipc服务器在一个客户端停止后停止
EN

Stack Overflow用户
提问于 2012-06-01 03:15:55
回答 2查看 160关注 0票数 0

我有一个简单的ipc程序。服务器生成一个随机数,并从多个客户端的stdin中读取。每个客户端将随机数发送到服务器,直到它们猜到服务器的号码。当超过n/2个客户端猜测该数字时,服务器将停止。我的问题是,服务器在第一个客户端猜测数字后停止。

服务器代码:

代码语言:javascript
运行
复制
int i=0; // the number of clients who guessed the number
srand(getpid()); 
numarul = rand() % 20;
printf("Numarul generat este %d \n",numarul);
for(;;){
   if(msgrcv(coadaId,&mesg,sizeof(Mesaj),1,0)<0) // read the mesage from queue
       printf("Eroare la receptionarea mesajului.");
   else{
       printf("Am primit numarul %d \n", mesg.nr); 
   if(mesg.nr == numarul){
                         i++; // is the number is guessed
                         printf("S-a ghicit numarul de la %d clienti \n",i);
                         mesg.val=1;} // msg.val = 1 if number is guessed
   mesg.tip=2; // change the message type
   msgsnd(coadaId,&mesg,sizeof(Mesaj),0); // send the msg.val . if 1 client stops
   mesg.val=0;
   if(i>n/2)break; // the loop ends when i is bigger than half number of clients
  }
  }

客户端代码:

代码语言:javascript
运行
复制
mesg1.val=0;
srand(getpid()); 
while(mesg1.val!=1){
    mesg1.nr = rand() % 20; // generates number
    mesg1.tip=1;  // type = 1 
    if(msgsnd(coadaId,&mesg1,sizeof(Mesaj),0)<0) // sends message to queue
      printf("Eroare la trimiterea mesajului:");
    msgrcv(coadaId,&mesg1,sizeof(Mesaj),2,0); // reads message from the server
    if(mesg1.val==1)exit(0); // if the number is guessed quit 
  }

谢谢

EN

回答 2

Stack Overflow用户

发布于 2012-06-01 06:04:09

即使算术运算符优先于相等运算符,使用括号来提高清晰度仍然是一个好主意。

票数 0
EN

Stack Overflow用户

发布于 2014-03-27 16:54:31

i在第一个客户端猜测数字之前等于0,在第一个客户端猜测后等于1。当为i>n/2时,服务器循环结束。正如你所说,当i等于1时,就会发生这种情况。由此得出0≤n/2 < 1⇔0≤n< 2,所以,如果n是一个整数,它就是0或1。如果你不相信这一点,那么在循环后显示n

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10839864

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档