Re[5]: HELP2: Еще один вопрос по pipe
От: Baggy  
Дата: 26.11.02 10:19
Оценка:
Здравствуйте, Baggy, Вы писали:

B>Здравствуйте, SCS, Вы писали:


SCS>>Здравствуйте, Baggy, Вы писали:

B>>>А возможно ли сделать следуещее: 1 раз создать сервер, а клиенты подключается, оставляют сообщение и отключается — т.е. как бы Сервер последовательно работает с каждым из клиентов?

SCS>>своя рука владыка

SCS>>тока клиент может стукнуться когда pipe занят.
SCS>>пример одного потока (таких можно сделать много)

SCS>>
SCS>>while(TRUE)
SCS>>{ CreateNamedPipe()
SCS>>  while(!FLAG_EXIT)
SCS>>  { ReadFile();
SCS>>    ...
SCS>>    WriteFile();
SCS>>  }
SCS>>  CloseHandle();
SCS>>  if(что-то) break;
SCS>>}
SCS>>


Извиняюсь за нечитабельность
У меня еще такой вопрос:
1. Со стороны сервера:

hMainPipe = CreateNamedPipe(MainPipeName,PIPE_ACCESS_INBOUND,
        PIPE_TYPE_MESSAGE,PIPE_UNLIMITED_INSTANCES,
        0,0,NMPWAIT_USE_DEFAULT_WAIT,0);
        if (hMainPipe==INVALID_HANDLE_VALUE)
        {
        
            MessageBox(NULL,"","",MB_OK);
            return 0;
        }
        if (GetLastError()==ERROR_ALREADY_EXISTS)
        {
        
        MessageBox(NULL,"","",MB_OK); 
        return 0;
        } 
    while (TRUE)
    {
        if (FLAG_EXIT) break;
        if (ConnectNamedPipe(hMainPipe,0)||GetLastError()==ERROR_PIPE_CONNECTED)
        {
            fSuccess=ReadFile(hMainPipe,temp_name,22*sizeof(char),&temp_int,0);
            if (fSuccess && (temp_int==22*sizeof(char)))
            {
                // Something
            }
            DisconnectNamedPipe(hMainPipe);
        }
    }
    CloseHandle(hMainPipe);

2. Со стороны клиента:
hMain = CreateFile(MainPipeName,GENERIC_WRITE,
        FILE_SHARE_READ|FILE_SHARE_WRITE,0,OPEN_EXISTING,0,0);
     
    if (hMain==INVALID_HANDLE_VALUE)
    {
        return (FALSE);
    }
    if (GetLastError()==ERROR_PIPE_BUSY)
    {
        if (!WaitNamedPipe(MainPipeName, 2000)) 
        return (FALSE);
    }
    if(!(WriteFile(hMain,temp_pipepath,22*sizeof(char),&temp_int,0)&&temp_int==22*sizeof(char)))
    {
    return (FALSE);
    }
    if (!CloseHandle(hMain))
        return (FALSE);

Однако как всегда после 1-го подулючения все остальные оказываются неудачными...
Хотя именно такой метод использования DisconnectNamedPipe() указан в MSDN...
Почему он не отрубает клиента освобождая клиентскую сторону канал для нового подключения?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.