Вообщем есть следующий механизм:
Нужно осуществить связь процесса Сервера, который читает сообщения, и процессов клиентов которые это сообщения туда пишут...:
Так вот алгоритм мой таков:
1. В процессе сервере создается Именнованный пайп и начаниет циклиться читая сообщения:
... Соответственно Пайп создается почти нормально (см.предыдущее моё сообщение в этом форуме)...
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 то получается тот же результат...)
Здравствуйте, Baggy, Вы писали:
B>Вообщем есть следующий механизм: B>Нужно осуществить связь процесса Сервера, который читает сообщения, и процессов клиентов которые это сообщения туда пишут...:
Pipe — это соединение "точка-точка". Поэтому на сервере нужно выдавать столько CreateNamedPipe, скольких клиентов ты хочешь обслуживать (обычно запускают несколько thread'ов сервера)
Здравствуйте, SCS, Вы писали:
SCS>Здравствуйте, Baggy, Вы писали:
B>>Вообщем есть следующий механизм: B>>Нужно осуществить связь процесса Сервера, который читает сообщения, и процессов клиентов которые это сообщения туда пишут...:
SCS>Pipe — это соединение "точка-точка". Поэтому на сервере нужно выдавать столько CreateNamedPipe, скольких клиентов ты хочешь обслуживать (обычно запускают несколько thread'ов сервера)
SCS>ERROR_ALREADY_EXISTS — очепятка
А возможно ли сделать следуещее: 1 раз создать сервер, а клиенты подключается, оставляют сообщение и отключается — т.е. как бы Сервер последовательно работает с каждым из клиентов?
Здравствуйте, Baggy, Вы писали: B>А возможно ли сделать следуещее: 1 раз создать сервер, а клиенты подключается, оставляют сообщение и отключается — т.е. как бы Сервер последовательно работает с каждым из клиентов?
своя рука владыка
тока клиент может стукнуться когда pipe занят.
пример одного потока (таких можно сделать много)
Здравствуйте, SCS, Вы писали:
SCS>Здравствуйте, Baggy, Вы писали: B>>А возможно ли сделать следуещее: 1 раз создать сервер, а клиенты подключается, оставляют сообщение и отключается — т.е. как бы Сервер последовательно работает с каждым из клиентов?
Здравствуйте, Baggy, Вы писали:
B>Здравствуйте, SCS, Вы писали:
SCS>>Здравствуйте, Baggy, Вы писали: B>>>А возможно ли сделать следуещее: 1 раз создать сервер, а клиенты подключается, оставляют сообщение и отключается — т.е. как бы Сервер последовательно работает с каждым из клиентов?
SCS>>своя рука владыка SCS>>тока клиент может стукнуться когда pipe занят. 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...
Почему он не отрубает клиента освобождая клиентскую сторону канал для нового подключения?
Здравствуйте, SCS, Вы писали:
SCS>Здравствуйте, Baggy, Вы писали:
SCS>в клиенте после WaitNamedPipe (разумеется, если без ошибок) надо заново вызвать CreateFile, а не проваливаться на WriteFile
т.е. при запуске клиента надо сначала WaitNamedPipe запускать а потом уже CreateFile?
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.