Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.09;
Скачать: CL | DM;

Вниз

NamedPipe   Найти похожие ветки 

 
andrey__   (2004-11-19 14:08) [0]

Есть проблема связанная с тем что когда я на клиенте произвожу подряд несколько записей в канал (пусть 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 сек) все работает.
Если кто может помочь решить эту проблему заранее спасибо.


 
andrey__   (2004-11-19 14:11) [1]

>произвожу подряд несколько записей в канал
Это значит что в коде я пишу:
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);


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


 
Digitman ©   (2004-11-19 14:19) [2]


> andrey__


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


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

>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"

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


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


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


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


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


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


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


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

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

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

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


 
Digitman ©   (2004-11-19 16:32) [7]


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


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

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

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

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


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

Digitman ©   (19.11.04 16:32) [7]

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

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


 
Digitman ©   (2004-11-19 17:09) [9]


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


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

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


 
andrey__   (2004-11-22 11:14) [10]

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

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

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

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

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


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

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


 
Xaker ©   (2004-11-22 11:46) [12]

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


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

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


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


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


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

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

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


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

andrey__   (22.11.04 14:40) [13]


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


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



Страницы: 1 вся ветка

Текущий архив: 2005.01.09;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.05 c
3-1102588332
Garry_c
2004-12-09 13:32
2005.01.09
Как изменить (или переопределить) параметры у запроса DBE


3-1102596992
galexis
2004-12-09 15:56
2005.01.09
Сколько записей в DBGrid?


11-1085240878
Денис
2004-05-22 19:47
2005.01.09
TKOLTreeView пример


14-1102690000
Zilog
2004-12-10 17:46
2005.01.09
Мне кажется некоторые тут особо высокомерные


14-1103251722
Думкин
2004-12-17 05:48
2005.01.09
С днем рождения! 17 декабря