![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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);
т.е. один за другим.