Здравствуйте, 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...
Почему он не отрубает клиента освобождая клиентскую сторону канал для нового подключения?