【问题标题】:Unix ipc server stops after one client stops一个客户端停止后,Unix ipc 服务器停止
【发布时间】:2012-05-31 19:15:54
【问题描述】:

我有一个简单的 ipc 程序。服务器生成一个随机数,并从标准输入读取多个客户端。每个客户端向服务器发送随机数,直到他们猜出服务器的号码。当超过 n/2 个客户端猜到这个数字时,服务器停止。我的问题是服务器在第一个客户端猜到数字后停止。

服务器代码:

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
  }
  }

客户端代码:

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 
  }

谢谢

【问题讨论】:

  • 在服务器代码中,n 是否会根据客户端数量增加?
  • 不,n 是用 scanf 在服务器代码中读取的,并且保持不变

标签: c queue ipc


【解决方案1】:

尽管算术运算符优先于等式运算符,但使用括号来提高清晰度仍然是个好主意。

【讨论】:

    【解决方案2】:

    i 在第一个客户端猜到数字之前等于 0,之后等于 1。服务器循环在i&gt;n/2 时结束。正如你所说,当i 等于 1 时会发生这种情况。由此得出 0 ≤ n/2 n 是整数,则它是 0 或 1。如果你不不信,在循环后显示n

    【讨论】: