![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Named Pipes
Polevi © (2006-09-11 17:09:00)нужно получать инфу от сервиса, создаю однонаправленный пайп
hPipe:=CreateNamedPipe('\\.\PIPE\Test',PIPE_ACCESS_OUTBOUND,PIPE_TYPE_BYTE,1,buf Size,bufSize,INFINITE,nil);
if hPipe<>INVALID_HANDLE_VALUE then
while true do
begin
ConnectNamedPipe(hPipe,nil);
if Terminated then break;
WriteFile(hPipe,
FlushFileBuffers(hPipe);
DisconnectNamedPipe(hPipe);
end;
в качестве клиента использую type
type \\.\Pipe\Test отлично отображает возвращаемые данные
но при попытке указать имя сервера
type \\localhost\Pipe\Test получаю "неверная функция"
что не так ?
Polevi (2006-09-12 10:17:00) [21]>Сергей М. © (12.09.06 10:08) [17]
блин я что непонятно выражаюсь чтоли
я знаю что "Экз-р пайпа на серверной стороне м.б. создан только так"
именно так я его и создаю что видно из моего кода
проблема на стороне клиента
мой вопрос заключается в том почему код [4] в котором явно указано имя localhost работает, а type \\localhost\Pipe\Test нет
неужели трудно сначала внимательно ветку прочитать, извините
Сергей М. (2006-09-12 10:08:00) [22]
> Polevi © (12.09.06 10:01) [16]
А что насчет него ?
В [1] и [2] все сказано по этому поводу.
Экз-р пайпа на серверной стороне м.б. создан только так
\\ .\pipe\Pipename
и никак иначе.
"Точка" как раз и указывает, что пайп локальный.
А localhost - это совсем из другой оперы, к пайпам отношения не имеющей.
Polevi (2006-09-12 10:01:00) [23]>Сергей М. © (12.09.06 08:17) [15]
а что насчет сабжа
Сергей М. (2006-09-12 08:17:00) [24]
> Polevi © (11.09.06 18:31) [13]
> убить поток из другого через CloseHandle
Поток не убивается "через CloseHandle".
Если же под handle подразумевается хэндл пайпа, "висящего" на блокирующей ф-ции, то и его убить "из другого через CloseHandle" тоже не удастся.
Rouse_ (2006-09-11 20:56:00) [25]
> Polevi © (11.09.06 18:17) [10]
> >Rouse_ © (11.09.06 18:11) [8]
> то есть [5] ?
Нет, т.е. невернаЯ трактовка имени кольцевого шлюза на локальной машине...
Polevi (2006-09-11 18:31:00) [26]>Eraser © (11.09.06 18:24) [11]
CharToOEMBuff(PChar(AMsg),PChar(AMsg),Length(AMsg));
>Чапаев © (11.09.06 18:26) [12]
>к пайпу нельзя обратиться как к файлу
>Пайп нельзя создать на удалённой машине
ты бы свой пост перечитал перед отправкой
>А while not Terminated do слабо? ;-)
не слабо, сделано для того убить поток из другого через CloseHandle
Чапаев (2006-09-11 18:26:00) [27]> while true do
> begin
> ConnectNamedPipe(hPipe,nil);
> if Terminated then break;
> WriteFile(hPipe,
> FlushFileBuffers(hPipe);
> DisconnectNamedPipe(hPipe);
> end;
Аwhile not Terminated doслабо? ;-)
> ты имеешь в виду что к пайпу нельзя обратиться как к файлу
> если он еа удаленной машине ?
Пайп нельзя создать на удалённой машине. Только локально. Подключиться к удалённому пайпу можно. \\localhost\PIPE\PipeName -- "удалённая машина".
Eraser (2006-09-11 18:24:00) [28]> [9] Polevi © (11.09.06 18:14)
> FlushFileBuffers
угу, это помогло :)
не большой оффтоп:
а какой функцией переводить кодировку? CharToOem как-то неправильно работает..
Polevi (2006-09-11 18:17:00) [29]>Rouse_ © (11.09.06 18:11) [8]
то есть [5] ?
Polevi (2006-09-11 18:14:00) [30]>Rouse_ © (11.09.06 18:06) [6]
пингуется, пробовал
см [4] там в пути явно указано имя и все работает
>Eraser © (11.09.06 18:06) [7]
у меня были такиеже проблемы, надо возвращаемые сервером данные завершать #26 и перед DisconnectNamedPipe вызывать FlushFileBuffers
type \\.\Pipe\Test работает на ура, стабильно
очень не хотется специального клиента писать, хотел ограничится стандартными средствами ОС
Rouse_ (2006-09-11 18:11:00) [31]Здается мне что проблема в RtlDosPathNameToNtPathName_U вызываемом внутри CreateNamedPipe, после чего происходит вызов NtCreateNamedPipeFile.
Скорее именно тут и бьется твой localhost, в отличие от прямого CreateFile
Eraser (2006-09-11 18:06:00) [32]> [4] Polevi © (11.09.06 18:03)
мда.. сейчас попробовал поработать с type.. проблемы какие-то, то строку принимает, но как то криво, то вообще пишет мол "С обоих концов канала отсутствуют процессы." или "Не удается найти указанный файл." хотя вроде бы все нормально.. не первый раз работаю с пайпами..
может в режиме PIPE_TYPE_MESSAGE попробовать..?
Rouse_ (2006-09-11 18:06:00) [33]localhost пингуется? По имени машины пробовал?
Polevi (2006-09-11 18:04:00) [34]>Eraser © (11.09.06 17:28) [1]
ты имеешь в виду что к пайпу нельзя обратиться как к файлу если он еа удаленной машине ?
Polevi (2006-09-11 18:03:00) [35]проблема именно в type, самописный клиент отлично работает
procedure TForm1.FormCreate(Sender: TObject);
const
PipeName='\\localhost\PIPE\Test';
var
hPipe:THandle;
bytes:Cardinal;
s:string;
begin
SetLength(s,1024);
if WaitNamedPipe(PipeName,INFINITE) then
begin
hPipe:=CreateFile(PipeName,GENERIC_READ,0,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMA L,0);
if hPipe=INVALID_HANDLE_VALUE then
RaiseLastOSError;
ReadFile(hPipe,PChar(s)^,1024,bytes,nil);
Caption:=s;
end;
end;
Polevi (2006-09-11 17:54:00) [36]>Eraser © (11.09.06 17:28) [1]
причем тут это, "following form" объясняется тем что нельзя создать пайп на удаленной машине, поэтому надо точку указывать
имхо
>han_malign © (11.09.06 17:43) [2]
и что ? не понял к чему эти цитаты
han_malign (2006-09-11 17:43:00) [37]BOOL WaitNamedPipe(
LPCTSTR lpNamedPipeName,
DWORD nTimeOut
);
lpNamedPipeName
[in] Pointer to a null-terminated string that specifies the name of the named pipe. The string must include the name of the computer on which the server process is executing. A period may be used for the servername if the pipe is local. The following pipe name format is used:
\\servername\pipe\pipename
.....................................
If the function succeeds, the process should use the CreateFilefunction to open a handle to the named pipe.
Eraser (2006-09-11 17:28:00) [38]> [0] Polevi © (11.09.06 17:09)
наверное потому что
lpName
[in] Pointer to the null-terminated string that uniquely identifies the pipe. The string must have the following form:
\\.\pipe\pipename
(c) MSDN
видать не предусмотрели просмотр пайпов для сетевых ресурсов..