Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > iterative server


Автор: sol78 5.1.2008, 17:37
Problema takaya :
dlya togo chtob Iterative Server vsegda nahodilsya v ozhidanie clientov, nuzhno chtob na to fifo kotoroe on otkrivaet na read, ukazival esche odin, dopolnitelьniy deskriptor, togda dlya kernela etot fifo vsegda budet "zanyat" i on ne stanet ego zakrivatь.
ya delayu tak:
Код

#include "common.h"
#include <stdio.h>
#include <strings.h>

/*---- service function: removes '\n' */
void remn(char* buff)
{
    int bufflen;
    bufflen=strlen(buff);
    if ('\n' == buff[bufflen-1])
    {
        buff[bufflen-1] = '\0';
        bufflen--;
    }
}

void server(char* clientFifoName, char* fileName);

/*------- server main --------*/
main()
{
    FILE* serFifo;
    FILE* tmpFifo;
    char clientFifoName[MAXNAME];
    char fileName[MAXNAME];
    int rc;
    
    printf("server: started, PID=%d, FIFO=%s\n", getpid(), SERVER_FIFO);
    
    /* create Server FIFO */
    if((mknod(SERVER_FIFO, S_IFIFO | PERMS,0)<0) && 
       (errno!=EEXIST))
    {    
        perror("server: can't create server FIFO"); 
        exit(1);
    }
printf("kuku");
    /* open Server FIFO to read */
    serFifo = fopen(SERVER_FIFO, "r");
    if (NULL == serFifo)
    {
        perror("server: server FIFO open failed");
        unlink(SERVER_FIFO);
        exit(1);
    }
   /* open tmp FIFO to write */ //ne pomogaet, otrabotav server vixodit ....

     tmpFIFO= fopen(SERVER_FIFO, "w");
    if(NULL == tmpFIFO)
    {
     perror("server: tmp FIFO open failed");
      unlink(SERVER_FIFO);
      exit(1);
     }
 
        

    /* read client request, containing 2 strings:
       - clientFifoName
       - fileName
    */
    while(1){
    if ((NULL == fgets(clientFifoName, MAXNAME, serFifo)) ||
        (NULL == fgets(fileName, MAXNAME, serFifo)) )
    {
/*        perror ("server: failed to read client request");
        fclose(serFifo);
        unlink(SERVER_FIFO);
        exit(1); 
*/      continue; 
    }

    /* remove '\n' symbols */
    remn(clientFifoName);
    remn(fileName);

    printf("\nserver: request accepted: client FIFO=%s, file=%s\n",
           clientFifoName, fileName);
    
    /* call server procedure */
    server(clientFifoName, fileName);
    }
    /* close and unlink server FIFO */
    fclose(serFifo);
    unlink(SERVER_FIFO);
    exit(0);
}



kak eto sdelatь, umenya ne poluchaetsya?
P.S. Kogda  budet translit? 

Автор: bsa 5.1.2008, 17:43
sol78, транслит находится слева под смайликами в виде CheckBox'а

Автор: sol78 5.1.2008, 17:50
bsa, ti xotь proverь ego dlya nachala a potom, vstavlyay zamechaniya!

Автор: MAKCim 5.1.2008, 17:57
sol78, 
что конкретно не получается?

Автор: sol78 5.1.2008, 18:01
nado chtob server rabotal "beskonechno", - eto ne poluchaetsya .
esli net clientov on zavershaet svoyu rabotu?

Автор: MAKCim 5.1.2008, 18:23
sol78, 
1. в самой программе есть ошибки (впредь приводи рабочий код)
2. у меня все работает
если убрать
Код

server(clientFifoName, fileName);

то при запуске сервера идет такой вывод
Код

server: started, PID=4049, FIFO=fifo
kuku
server: request accepted: client FIFO=maxim, file=falaleev

server: request accepted: client FIFO=maxim, file=falaleev

server: request accepted: client FIFO=maxim, file=falaleev

server: request accepted: client FIFO=maxim, file=falaleev

server: request accepted: client FIFO=maxim, file=falaleev

код клиента
Код

int fd = open("fifo", O_WRONLY);
write(fd, "maxim\nfalaleev\n", 15);


Добавлено через 49 секунд
и используй CheckBox транслит

Автор: nickless 5.1.2008, 21:24
Слегка smile 
Транслит в данный момент http://forum.vingrad.ru/forum/topic-186356.html, надеемся что скоро починят...

Автор: MAKCim 5.1.2008, 21:42
nickless, 
не знал  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)