Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
15-1167911772
Mr. D.
2007-01-04 14:56
2007.01.28
Совмещение ESC последовательности с windows-печатью


15-1168535854
Andy BitOff
2007-01-11 20:17
2007.01.28
Рекламный ход. Какие ассоциации? =)


2-1168192483
Khabibulin
2007-01-07 20:54
2007.01.28
Засветить некоторые ячейки StringGrid а


2-1168325787
DelphiLexx
2007-01-09 09:56
2007.01.28
Быстрое заполнение дин. массива


15-1167484573
Slider007
2006-12-30 16:16
2007.01.28
С днем рождения ! 30 декабря





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский