Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.01.09;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.01.09;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.037 c
14-1103529471
TUser
2004-12-20 10:57
2005.01.09
Байкал-финанс


8-1096944491
Ozone
2004-10-05 06:48
2005.01.09
Video for Windows


1-1103699242
MakNik
2004-12-22 10:07
2005.01.09
RadioGroup


9-1093008860
Navi1982
2004-08-20 17:34
2005.01.09
Картинку в чужой кадр!!!


8-1096609183
Ozone
2004-10-01 09:39
2005.01.09
Video + Audio





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский