HELP2: Еще один вопрос по pipe
От: Baggy  
Дата: 26.11.02 07:31
Оценка:
Вообщем есть следующий механизм:
Нужно осуществить связь процесса Сервера, который читает сообщения, и процессов клиентов которые это сообщения туда пишут...:
Так вот алгоритм мой таков:
1. В процессе сервере создается Именнованный пайп и начаниет циклиться читая сообщения:
hMainPipe = CreateNamedPipe(MainPipeName,PIPE_ACCESS_INBOUND,
        PIPE_TYPE_MESSAGE,PIPE_UNLIMITED_INSTANCES,
        0,0,NMPWAIT_USE_DEFAULT_WAIT,0);


    while (TRUE)
    {
        fSuccess=ReadFile(hMainPipe,temp_name,22*sizeof(char),&temp_int,0);
        if (fSuccess && (temp_int==22*sizeof(char)))
        {
            // Îáðàáîòêà ïîñòóïèâøåãî ñîîáùåíèÿ...
            if (FLAG_EXIT) break;
        }
    }

... Соответственно Пайп создается почти нормально (см.предыдущее моё сообщение в этом форуме)...
2. В Процессе Клиенте происходит следующее:
HANDLE hPipe1 = CallNamedPipe(MainPipeName,temp_pipepath,22*sizeof(char),0,0,&temp_int,NMPWAIT_WAIT_FOREVER))
CloseHandle(hPipe1);
DWORD result = GetLastError();

А в результате:
при запуске одного экземпляра такого процесса все проходит нормально....сообщение проходит...
Однако при запуске второго и последующих экземпляров: hPipe1 = 0xffffffff;
а GetLastError выдает ошибку: 0xe7: т.е. Все копии канала заняты....

Если кто-нить понял в чём моя ошибка... подскажите плиз...

p.s. ( Если вместо CallNamedPipe использовать CreateFile и WriteFile то получается тот же результат...)
Re: HELP2: Еще один вопрос по pipe
От: SCS  
Дата: 26.11.02 07:45
Оценка:
Здравствуйте, Baggy, Вы писали:

B>Вообщем есть следующий механизм:

B>Нужно осуществить связь процесса Сервера, который читает сообщения, и процессов клиентов которые это сообщения туда пишут...:

Pipe — это соединение "точка-точка". Поэтому на сервере нужно выдавать столько CreateNamedPipe, скольких клиентов ты хочешь обслуживать (обычно запускают несколько thread'ов сервера)

ERROR_ALREADY_EXISTS — очепятка
SCS
Re[2]: HELP2: Еще один вопрос по pipe
От: Baggy  
Дата: 26.11.02 08:21
Оценка:
Здравствуйте, SCS, Вы писали:

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


B>>Вообщем есть следующий механизм:

B>>Нужно осуществить связь процесса Сервера, который читает сообщения, и процессов клиентов которые это сообщения туда пишут...:

SCS>Pipe — это соединение "точка-точка". Поэтому на сервере нужно выдавать столько CreateNamedPipe, скольких клиентов ты хочешь обслуживать (обычно запускают несколько thread'ов сервера)


SCS>ERROR_ALREADY_EXISTS — очепятка


А возможно ли сделать следуещее: 1 раз создать сервер, а клиенты подключается, оставляют сообщение и отключается — т.е. как бы Сервер последовательно работает с каждым из клиентов?
Re[3]: HELP2: Еще один вопрос по pipe
От: SCS  
Дата: 26.11.02 08:39
Оценка:
Здравствуйте, Baggy, Вы писали:
B>А возможно ли сделать следуещее: 1 раз создать сервер, а клиенты подключается, оставляют сообщение и отключается — т.е. как бы Сервер последовательно работает с каждым из клиентов?

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

while(TRUE)
{ CreateNamedPipe()
  while(!FLAG_EXIT)
  { ReadFile();
    ...
    WriteFile();
  }
  CloseHandle();
  if(что-то) break;
}
SCS
Re[4]: HELP2: Еще один вопрос по pipe
От: SCS  
Дата: 26.11.02 09:26
Оценка:
Здравствуйте, SCS, Вы писали:

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

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

Используй для этого mailslot
SCS
Re[4]: HELP2: Еще один вопрос по pipe
От: Baggy  
Дата: 26.11.02 09:49
Оценка:
Здравствуйте, SCS, Вы писали:

Сообщение закоцано, в след. топике автор его переписал нормально. H_D
Re[5]: HELP2: Еще один вопрос по pipe
От: SCS  
Дата: 26.11.02 10:13
Оценка:
Здравствуйте, Baggy, Вы писали:

в клиенте после WaitNamedPipe (разумеется, если без ошибок) надо заново вызвать CreateFile, а не проваливаться на WriteFile
SCS
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...
Почему он не отрубает клиента освобождая клиентскую сторону канал для нового подключения?
Re[6]: HELP2: Еще один вопрос по pipe
От: Baggy  
Дата: 26.11.02 10:22
Оценка:
Здравствуйте, SCS, Вы писали:

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


SCS>в клиенте после WaitNamedPipe (разумеется, если без ошибок) надо заново вызвать CreateFile, а не проваливаться на WriteFile


т.е. при запуске клиента надо сначала WaitNamedPipe запускать а потом уже CreateFile?
Re[7]: HELP2: Еще один вопрос по pipe
От: SCS  
Дата: 26.11.02 10:31
Оценка:
Здравствуйте, Baggy, Вы писали:

это из MSDN для подключения клиента
while (1) 
   { hPipe = CreateFile( 
         lpszPipename,   // pipe name 
         GENERIC_READ |  // read and write access 
         GENERIC_WRITE, 
         0,              // no sharing 
         NULL,           // no security attributes
         OPEN_EXISTING,  // opens existing pipe 
         0,              // default attributes 
         NULL);          // no template file 
   // Break if the pipe handle is valid.  
      if (hPipe != INVALID_HANDLE_VALUE) 
         break; 
      // Exit if an error other than ERROR_PIPE_BUSY occurs. 
      if (GetLastError() != ERROR_PIPE_BUSY) 
         MyErrExit("Could not open pipe"); 
      // All pipe instances are busy, so wait for 20 seconds. 
      if (! WaitNamedPipe(lpszPipename, 20000) ) 
         MyErrExit("Could not open pipe"); 
   } 
 
// The pipe connected; change to message-read mode.
SCS
Re[6]: HELP2: Еще один вопрос по pipe
От: wirr  
Дата: 06.11.03 19:07
Оценка:
Привет всем!
Народ, а кто-нибудь решил эту проблему то?
как быть с повторным открытием pipe на стороне клиента?
Re[7]: HELP2: Еще один вопрос по pipe
От: Аноним  
Дата: 18.10.06 13:24
Оценка:
Здравствуйте, wirr, Вы писали:

W>Привет всем!

W>Народ, а кто-нибудь решил эту проблему то?
W>как быть с повторным открытием pipe на стороне клиента?

У меня таже проблема.
Есть ли решение этой проблемы?
Помогите.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.