Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

NamedPipe [D6, Win2k]


andrey__ ©   (2004-11-19 14:08:00) 

Есть проблема связанная с тем что когда я на клиенте произвожу подряд несколько записей в канал (пусть 5 последовательностей WriteFile (hPipe,... ) то клиент производит две посылки подрят и виснет.
Реализ. сервера:
 hPipe := CreateNamedPipeW ('\\.\PIPE\test101158', // Имя канала = 'test'.
   PIPE_ACCESS_DUPLEX or      // Двусторонний канал
   FILE_FLAG_OVERLAPPED,      // Асинхронный ввод-вывод
   PIPE_WAIT or               // Ожидать сообщений
   PIPE_READMODE_MESSAGE or   // Обмен в канале производится пакетами
   PIPE_TYPE_MESSAGE,
   10,                 // Максимальное числе экземпляров канала.
   100, // Размеры буферов чтения/записи.
   100,
   0,                  // Тайм-аут.
   @sa);                      // Атрибуты безопасности.


Реализ. клиента.

     hPipe := CreateFileW ('\\.\PIPE\test101158'
       GENERIC_WRITE or // Доступ на чтение/запись
       GENERIC_READ,
       FILE_SHARE_READ or // Разделенный доступ
       FILE_SHARE_WRITE,
       nil,
       OPEN_EXISTING,   // Канал должен существовать
       FILE_FLAG_OVERLAPPED, // Использовать асинхронный ввод/вывод
       0);


Но если между записями в канал поставить задержку (1 сек) все работает.
Если кто может помочь решить эту проблему заранее спасибо.


Игорь Шевченко   (2004-11-22 14:56:00) [1]

andrey__   (22.11.04 14:40) [13]


> товарищи может кто-то может прислать свой вариант исходников
> сервера и клиента канала там где нет этого эффекта.


http://www.delphimaster.ru/articles/named_pipes/index.html


Digitman   (2004-11-22 14:47:00) [2]


> andrey__   (22.11.04 11:36) [11]
> Причём эта проблема только с клиентом


нет ну ты странный товарисч...

на кл.стороне никакие message mode или stream-mode не существуют в принципе !

сколько байт ты заказазываешь к приему в ReadFile[Ex] ?


andrey__   (2004-11-22 14:40:00) [3]

товарищи может кто-то может прислать свой вариант исходников сервера и клиента канала там где нет этого эффекта.
Буду очень признателен.


Xaker   (2004-11-22 11:46:00) [4]

имхо это как с сокетами - надо разделители ставить
//поток данных


andrey__   (2004-11-22 11:36:00) [5]

Причём эта проблема только с клиентом, сервер обрабатывает такую ситуацию привильно.


andrey__   (2004-11-22 11:14:00) [6]

Я могу выслать если надо проэкты сервера и клиента если кто интересуется.
Может кто поможет решить это проблему

Если сервер делает подрят несколько записей в канал то клиент иногда(особено если в процедуре чтения канала поставить маленькую задержку) их читает все за один раз. Т.е. если сервер делает так:

ServerPipe1.WritePipe('111');
ServerPipe1.WritePipe('222');
ServerPipe1.WritePipe('333');

то клиент при чтении получает строку: '111222333'

А этого мне надо избежать.


Digitman   (2004-11-19 17:09:00) [7]


> Игорь Шевченко ©   (19.11.04 17:01) [8]


ну ты ж видел, как я по асфальту на лыжах пытался вчерась ?

примерно на ту же тему и это ...


Игорь Шевченко   (2004-11-19 17:01:00) [8]

Digitman ©   (19.11.04 16:32) [7]

Не говори, всю неделю.

Тогда непонятно, почему у него, если сервер посылает в канал 3 сообщения, клиент читает одно.


Digitman   (2004-11-19 16:32:00) [9]


> Игорь Шевченко ©   (19.11.04 16:22) [4]


игорь, ты кажись не выспался сегодня ..

цитата из автора :

  PIPE_READMODE_MESSAGE or   // Обмен в канале производится пакетами
  PIPE_TYPE_MESSAGE,

оно ли не то самое ?


andrey__   (2004-11-19 16:31:00) [10]

>Игорь Шевченко ©   (19.11.04 16:22) [4]

Я выше описал создание pipe и там было
  PIPE_READMODE_MESSAGE or   // Обмен в канале производится пакетами
  PIPE_TYPE_MESSAGE,

Если ты это имел ввиду.


Digitman   (2004-11-19 16:25:00) [11]


> этого мне надо избежать


ставь отправки в очередь.
отправляй след.сообщение ТОЛЬКО при условии возникновения completion event


Игорь Шевченко   (2004-11-19 16:22:00) [12]


> ServerPipe1.WritePipe('111');
> ServerPipe1.WritePipe('222');
> ServerPipe1.WritePipe('333');
>
> то клиент при чтении получает строку: '111222333'
>
> А этого мне надо избежать.


Messages mode при создании pipe


andrey__   (2004-11-19 16:14:00) [13]

>Digitman ©   (19.11.04 14:19) [2]

Я делаю так просто для краткости вам написал
  Pipe1.WritePipe(edit1.Text);
  Pipe1.WritePipe(edit1.Text);
  Pipe1.WritePipe(edit1.Text);
  Pipe1.WritePipe(edit1.Text);

procedure TNamePipeClass.WritePipe(st: string);
var
 rc: Boolean;
 bytesWritten: DWORD;
 lastError: DWORD;
 stw:string;
 len:byte;
begin
         StrCopy(sendBuf,Pchar(st));
         len:=Length(st);
         // Записать сообщение в канал
         rc := WriteFile (hPipe, sendBuf, len{MAX_WRITE},      bytesWritten,  @OverLapWrt);

         if not rc then
         begin
           lastError := GetLastError;
           // Если IO_PENDING, ждать завершения асинхронной операции записи
           if lastError = ERROR_IO_PENDING then
             WaitForSingleObject (hEventWrt, INFINITE)
         end;

end;


Извините нашёл ошибку - задал маленькиу буфер
hPipe := CreateNamedPipeW ('\\.\PIPE\test101158', // Имя канала = 'test'.
  PIPE_ACCESS_DUPLEX or      
  FILE_FLAG_OVERLAPPED,      
  PIPE_WAIT or              
  PIPE_READMODE_MESSAGE or    пакетами
  PIPE_TYPE_MESSAGE,
  10,                
  1000, // Ошибка была сдесь
  1000,

  0,                
  @sa);              


Но появилась новая проблема:
Если наоборот сервер делает подрят несколько записей в канал то клиент иногда(особено если в процедуре чтения канала поставить маленькую задержку) их читает все за один раз. Т.е. если сервер делает так:

ServerPipe1.WritePipe('111');
ServerPipe1.WritePipe('222');
ServerPipe1.WritePipe('333');

то клиент при чтении получает строку: '111222333'

А этого мне надо избежать.


Digitman   (2004-11-19 14:19:00) [14]


> andrey__


и какого шута ты не анализируешь всякий раз при этом рез-т вызова WriteFile ?


andrey__   (2004-11-19 14:11:00) [15]

>произвожу подряд несколько записей в канал
Это значит что в коде я пишу:
WriteFile (hPipe, sendBuf, len{MAX_WRITE}, bytesWritten,
           @OverLapWrt);
WriteFile (hPipe, sendBuf, len{MAX_WRITE}, bytesWritten,
           @OverLapWrt);
WriteFile (hPipe, sendBuf, len{MAX_WRITE}, bytesWritten,
           @OverLapWrt);
WriteFile (hPipe, sendBuf, len{MAX_WRITE}, bytesWritten,
           @OverLapWrt);


т.е. один за другим.


Наверх

Титульная страница Поиск, карта сайта Написать письмо