0

私は単純なipcプログラムを持っています。サーバーは乱数を生成し、標準入力から多数のクライアントを読み取ります。各クライアントは、サーバーの番号を推測するまで乱数を server に送信します。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 
  }

ありがとう

4

2 に答える 2

0

i最初のクライアントが数字を推測する前は 0 で、推測した後は 1 です。サーバー ループは のときに終了しi>n/2ます。おっしゃる通り、 が 1のときiです。このことから 0 ≤ n/2 < 1 ⇔ 0 ≤ n < 2 なので、nが整数なら 0 か 1 です。nループの後。

于 2014-03-27T08:54:30.520 に答える
0

算術演算子は等値演算子よりも優先されますが、わかりやすくするために括弧を使用することをお勧めします。

于 2012-05-31T22:04:09.420 に答える