Форум: "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.033 c