2012-05-31 112 views
0

我有一个简单的ipc程序。服务器生成一个随机数,并从stdin读取一些客户端。每个客户端都会向服务器发送随机数,直到他们猜到服务器的编号。当超过n/2个客户端猜测数量时,服务器停止。我的问题是服务器在第一个客户端猜到数字后停止。一台客户机停止后,Unix ipc服务器停止

服务器代码:

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 
    } 

感谢

+0

在服务器代码中,“n”是否曾经根据客户端数量递增? –

+0

不,使用scanf在服务器代码中读取n,并保持不变 – vladCovaliov

回答

0

即使算术运算符优先于平等的运营商,它仍然是使用括号是一个好主意以提高清晰度。

0

i等于0之前,等于1后,第一个客户端猜测数量。服务器循环在i>n/2时结束。正如你所说的,出现这种情况时i等于1.由此得出0 ≤ N/2 ñ< 2,所以,如果n是一个整数,它是0或1。如果你不相信, ,循环后显示n