Форум: "WinAPI";
Текущий архив: 2007.01.28;
Скачать: [xml.tar.bz2];
ВнизNamed Pipes Найти похожие ветки
← →
Polevi © (2006-09-11 17:09) [0]нужно получать инфу от сервиса, создаю однонаправленный пайп
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 получаю "неверная функция"
что не так ?
← →
Eraser © (2006-09-11 17:28) [1]> [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
видать не предусмотрели просмотр пайпов для сетевых ресурсов..
← →
han_malign © (2006-09-11 17:43) [2]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 CreateFile function to open a handle to the named pipe.
← →
Polevi © (2006-09-11 17:54) [3]>Eraser © (11.09.06 17:28) [1]
причем тут это, "following form" объясняется тем что нельзя создать пайп на удаленной машине, поэтому надо точку указывать
имхо
>han_malign © (11.09.06 17:43) [2]
и что ? не понял к чему эти цитаты
← →
Polevi © (2006-09-11 18:03) [4]проблема именно в 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 18:04) [5]>Eraser © (11.09.06 17:28) [1]
ты имеешь в виду что к пайпу нельзя обратиться как к файлу если он еа удаленной машине ?
← →
Rouse_ © (2006-09-11 18:06) [6]localhost пингуется? По имени машины пробовал?
← →
Eraser © (2006-09-11 18:06) [7]> [4] Polevi © (11.09.06 18:03)
мда.. сейчас попробовал поработать с type.. проблемы какие-то, то строку принимает, но как то криво, то вообще пишет мол "С обоих концов канала отсутствуют процессы." или "Не удается найти указанный файл." хотя вроде бы все нормально.. не первый раз работаю с пайпами..
может в режиме PIPE_TYPE_MESSAGE попробовать..?
← →
Rouse_ © (2006-09-11 18:11) [8]Здается мне что проблема в RtlDosPathNameToNtPathName_U вызываемом внутри CreateNamedPipe, после чего происходит вызов NtCreateNamedPipeFile.
Скорее именно тут и бьется твой localhost, в отличие от прямого CreateFile
← →
Polevi © (2006-09-11 18:14) [9]>Rouse_ © (11.09.06 18:06) [6]
пингуется, пробовал
см [4] там в пути явно указано имя и все работает
>Eraser © (11.09.06 18:06) [7]
у меня были такиеже проблемы, надо возвращаемые сервером данные завершать #26 и перед DisconnectNamedPipe вызывать FlushFileBuffers
type \\.\Pipe\Test работает на ура, стабильно
очень не хотется специального клиента писать, хотел ограничится стандартными средствами ОС
← →
Polevi © (2006-09-11 18:17) [10]>Rouse_ © (11.09.06 18:11) [8]
то есть [5] ?
← →
Eraser © (2006-09-11 18:24) [11]> [9] Polevi © (11.09.06 18:14)
> FlushFileBuffers
угу, это помогло :)
не большой оффтоп:
а какой функцией переводить кодировку? CharToOem как-то неправильно работает..
← →
Чапаев © (2006-09-11 18:26) [12]> 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 -- "удалённая машина".
← →
Polevi © (2006-09-11 18:31) [13]>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
← →
Rouse_ © (2006-09-11 20:56) [14]
> Polevi © (11.09.06 18:17) [10]
> >Rouse_ © (11.09.06 18:11) [8]
> то есть [5] ?
Нет, т.е. невернаЯ трактовка имени кольцевого шлюза на локальной машине...
← →
Сергей М. © (2006-09-12 08:17) [15]
> Polevi © (11.09.06 18:31) [13]
> убить поток из другого через CloseHandle
Поток не убивается "через CloseHandle".
Если же под handle подразумевается хэндл пайпа, "висящего" на блокирующей ф-ции, то и его убить "из другого через CloseHandle" тоже не удастся.
← →
Polevi © (2006-09-12 10:01) [16]>Сергей М. © (12.09.06 08:17) [15]
а что насчет сабжа
← →
Сергей М. © (2006-09-12 10:08) [17]
> Polevi © (12.09.06 10:01) [16]
А что насчет него ?
В [1] и [2] все сказано по этому поводу.
Экз-р пайпа на серверной стороне м.б. создан только так
\\.\pipe\Pipename
и никак иначе.
"Точка" как раз и указывает, что пайп локальный.
А localhost - это совсем из другой оперы, к пайпам отношения не имеющей.
← →
Polevi © (2006-09-12 10:17) [18]>Сергей М. © (12.09.06 10:08) [17]
блин я что непонятно выражаюсь чтоли
я знаю что "Экз-р пайпа на серверной стороне м.б. создан только так"
именно так я его и создаю что видно из моего кода
проблема на стороне клиента
мой вопрос заключается в том почему код [4] в котором явно указано имя localhost работает, а type \\localhost\Pipe\Test нет
неужели трудно сначала внимательно ветку прочитать, извините
← →
Polevi © (2006-09-12 10:18) [19]кстати насчет CloseHandle ты был прав, неожидал я такой подставы
← →
Сергей М. © (2006-09-12 10:45) [20]
> Polevi © (12.09.06 10:17) [18]
А если так
type \\CompName\Pipe\Test
?
> насчет CloseHandle ..неожидал я такой подставы
Начиная с Vista и Longhorn эта засада ликвидирована
← →
Polevi © (2006-09-12 10:51) [21]>type \\CompName\Pipe\Test
не работает, в том то и беда
я расчитывал таким образом получать статистику с сервиса из любой машины в сети
написать своего клиента 2 минуты делов, но охота понять в чем проблема
← →
Сергей М. © (2006-09-12 10:54) [22]
> не работает, в том то и беда
что говорит ?
← →
Polevi © (2006-09-12 11:13) [23]Неверная функция
неплохо бы отладчиком ковырнуть, да нет его у меня
← →
Сергей М. © (2006-09-12 11:30) [24]
> Polevi © (12.09.06 11:13) [23]
У меня:
"Access denied" в ответ на type \\CompName\Pipe\Test
"A duplicate name exists on the network" в ответ на type \\localhost\Pipe\Test
← →
Polevi © (2006-09-12 11:54) [25]понятно
вообщем я понял не судьба, напишу своего клиента
спасибо за внимание
← →
Alex Konshin © (2006-09-13 02:06) [26]У меня на сайте есть пример по named pipes, смотри в MS SQL Alerter http://home.earthlink.net/~akonshin/files/SQLAlert.zip
Насколько я помню, он отлично работал с удаленными серверами.
← →
Polevi © (2006-09-13 11:07) [27]я рад за тебя
мой пример тоже "отлично работает с удаленными серверами"
что ты можешь сказать по сабжу, а именно использование type для чтения из пайпа
← →
Сергей М. © (2006-09-13 11:09) [28]
> Polevi © (13.09.06 11:07) [27]
Кстати, с copy и xcopy - та же история
← →
Polevi © (2006-09-13 13:02) [29]>Сергей М. © (13.09.06 11:09) [28]
угу, чтобы понять надо отладчиком смотреть их потроха
чтото не видно Игоря Шевченко, может он чего скажет по этому вопросу
← →
Rouse_ © (2006-09-13 14:21) [30]Попробуй ка выполнить соединение на вот эти два имени:
type
PUnicodeString = ^TUnicodeString;
TUnicodeString = packed record
Length,
MaxLength: WORD;
Buffer: PWideChar;
end;
function RtlDosPathNameToNtPathName_U(DosName: PWideChar;
var NtName: TUnicodeString; DosFilePath: PPWideChar;
var NtFilePath: TUnicodeString): BOOL; stdcall; external "ntdll.dll";
implementation
procedure TForm18.FormCreate(Sender: TObject);
var
Test1, Test2: PWideChar;
NtName, NtFilePath: TUnicodeString;
begin
Test1 := "\\.\pipe\test\";
Test2 := "\\localhost\pipe\test\";
RtlDosPathNameToNtPathName_U(Test1, NtName, nil, NtFilePath);
ShowMessage(NtName.Buffer);
RtlDosPathNameToNtPathName_U(Test2, NtName, nil, NtFilePath);
ShowMessage(NtName.Buffer);
end;
← →
Rouse_ © (2006-09-13 14:22) [31]В смысле через свое CreateFile с указанием имен которые выдаст мой код...
← →
Игорь Шевченко © (2006-09-13 17:50) [32]Я извиняюсь, а type умеет с UNC-именами работать ? (Я не в курсе просто)
← →
Polevi © (2006-09-14 13:36) [33]>Rouse_ © (13.09.06 14:22) [31]
твой код пустые строки возвращает
>Игорь Шевченко © (13.09.06 17:50) [32]
type \\.\Pipe\Test работает
← →
Rouse_ © (2006-09-14 13:44) [34]Пустые строки? Хм... нтересно...
у меня на первый выдает: \??\pipe\test\
на второй: \??\UNC\localhost\pipe\test\
← →
han_malign © (2006-09-14 14:08) [35]
> Я извиняюсь, а type умеет с UNC-именами работать ? (Я не в курсе просто)
- умеет - "простые файлы" заглатывает...
type \\127.0.0.1\shared\test.txt
- с удаленных и по имени компьютера тоже берет.
а вот localhost - не берет - говорит "You were not connected because a duplicate name exists on the network. Go to System in Control Panel to change the computer name and try again."
XP SP2
но тут еще вопрос в доменных политиках, в наличии DNS, и т.д. и т.п. .
← →
han_malign © (2006-09-14 14:11) [36]
> на второй: \??\UNC\localhost\pipe\test\
- может все-таки \\?\UNC\localhost\pipe\test\ ?
← →
Rouse_ © (2006-09-14 14:29) [37]
> может все-таки \\?\UNC\localhost\pipe\test\ ?
Ты не путай символьную ссылку с путем...
← →
Игорь Шевченко © (2006-09-14 16:25) [38]Polevi © (14.09.06 13:36) [33]
> type \\.\Pipe\Test работает
Это ж не UNC, это локальное имя.
han_malign © (14.09.06 14:08) [35]
> - умеет - "простые файлы" заглатывает...
> type \\127.0.0.1\shared\test.txt
Это если он shared, не так ли ? Я не в курсе, с какими опциями команда type выдает CreateFile.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2007.01.28;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.042 c