2012-05-31 3 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

нет, n считывается в код сервера с помощью scanf и остается неизменным – vladCovaliov

ответ

0

Даже если арифметические операторы имеют приоритет над операторами равенства, это все еще хорошая идея использовать круглые скобки для улучшения ясности.

0

i равно 0 до и равно 1 после того, как первый клиент угадывает номер. Контур сервера завершается, когда i>n/2. Как вы говорите, это происходит, когда i равен 1. Из этого следует, что 0 ≤ п/2 п < 2, поэтому, если n является целым числом, оно равно 0 или 1. Если вы не верите, что , дисплей n после цикла.

Смежные вопросы