Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Вниз

Именованые каналы - сетевое использование   Найти похожие ветки 

 
Michael   (2008-09-22 11:01) [0]

Добрый день!
Проблема при использовании именованых каналов: в локальном режиме (на одной машине) работает, в сетевом - нет.
Сервер создает соединение так:

 // Настройка дескриптора безопасности
 GetMem( FpSecurDiscriptor, SECURITY_DESCRIPTOR_MIN_LENGTH );
 InitializeSecurityDescriptor( FpSecurDiscriptor, SECURITY_DESCRIPTOR_REVISION );
 SetSecurityDescriptorDacl( FpSecurDiscriptor, True, nil, False );
 FSecurityAttributes.nLength:= SizeOf( FSecurityAttributes );
 FSecurityAttributes.lpSecurityDescriptor:= FpSecurDiscriptor;
 FSecurityAttributes.bInheritHandle:= True;
 // Создание PIPE
 try
   FPipeHandle := CreateNamedPipe( FServerName,          // имя сервера канала
                                   PIPE_ACCESS_DUPLEX,   // Режим открытия канала
                                   PIPE_WAIT or          // Режим канала
                                   PIPE_TYPE_BYTE or
                                   PIPE_READMODE_BYTE,
                                   1,                    // Количество возможных подключений
                                   500,                  // Размер выходного буфера
                                   500,                  // Размер входного буфера
                                   1000,                 // Timeout
                                   @FSecurityAttributes  // Аттрибуты безопасности
                                   );
 except
   // здесь обрабатываю исключение
   Exit;
 end;
 // Ожидание подключения клиента
 ConnectNamedPipe( FPipeHandle, nil);
 // Когда клиент подключился, считаем канал открытым

Клиент присоединяется следующим образом:

 repeat
   try
     FPipeHandle := CreateFile( FServerName, GENERIC_READ or GENERIC_WRITE, 0, nil,
                                OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0
                                );
   except
     Exit;
   end;
   Sleep( 5 );
 until FPipeHandle <> INVALID_HANDLE_VALUE;

При работе в локальном режиме (на одной машине) - переменные FServerName одинаковы для клиента и сервера и имеют значение "\\.\PIPE\TestPipe".
В сетевом режиме у клиента выставляю имя сервера в виде: "\\ServerHostName\PIPE\TestPipe". При таком подходе соединени не происходит - оба процесса "подвисают".
Подскажите, в чем может быть проблема? В аттрибутах? Но в локальном режиме все работает... На мсдн"е клиент тоже имеет точку в имени сервера. Но, насколько я понимаю - это касается только локального варианта.


 
Сергей М. ©   (2008-09-22 11:45) [1]

Начнем с того, что WinAPI-функции при их нормальном выполнении не генерируют исключительных ситуаций, так что заключение этих ф-ций в try..except-блок лишен смысла.


 
Сергей М. ©   (2008-09-22 11:54) [2]


> оба процесса "подвисают"


Серверный "подвисает" на выполнении ConnectNamedPipe : для синхронного блокирующего режима это абсолютно нормальное поведение- сервер не обнаруживает ни одного входящего клиентского запроса на соединение и ждет пока таковой будет обнаружен.

Клиентский "подвисает" в бесконечном repeat-цикле, потому что условие FPipeHandle <> INVALID_HANDLE_VALUE остается ложным сколь-либо долго - видимо, потому что серверный компютер с именем ServerHostName не существует.

А ты осознаешь разницу между HostName и ComputerName ?


 
Michael   (2008-09-22 13:05) [3]


> Сергей М. ©   (22.09.08 11:45) [1]
> Начнем с того, что WinAPI-функции при их нормальном выполнении
> не генерируют исключительных ситуаций, так что заключение
> этих ф-ций в try..except-блок лишен смысла.

Спасибо, учту.

> Серверный "подвисает" на выполнении ConnectNamedPipe : для
> синхронного блокирующего режима это абсолютно нормальное
> поведение- сервер не обнаруживает ни одного входящего клиентского
> запроса на соединение и ждет пока таковой будет обнаружен.
>

Этот момент мне понятен. Поведение сервера при ожидании подключения клиента не отличается в обоих случаях.

> Клиентский "подвисает" в бесконечном repeat-цикле, потому
> что условие FPipeHandle <> INVALID_HANDLE_VALUE остается
> ложным сколь-либо долго - видимо, потому что серверный компютер
> с именем ServerHostName не существует.

Собственно, в этом и заключается проблема. Серверный компьютер с именем, передаваемым в переменной ServerHostName существует. Связь есть. Наткнулся на мнение, что именованым каналам нужно:
а) Наличие хоть по одной расшареной папки
б) Наличие взаимных разрешений на доступ к этим папкам
Буду пробовать.

> А ты осознаешь разницу между HostName и ComputerName

Не совсем... Если под HostName подразумевается IP-шник, а под ComputerName - сетевое имя компьютера, то я имел в виду второе. В противном случае - разъясните, пожалуйста.


 
Сергей М. ©   (2008-09-22 13:17) [4]


> именованым каналам нужно:
> а) Наличие хоть по одной расшареной папки
> б) Наличие взаимных разрешений на доступ к этим папкам


Не нужно им никаких папок.


> под HostName подразумевается IP-шник


Не "IP-шник", а доменное имя хоста (см. DNS)


> ComputerName - сетевое имя компьютера


А еще точнее - NetBIOS-имя компьютера.
То самое, которое фигурирует в Сетевом окружении.


 
Michael   (2008-09-22 14:16) [5]


> Не нужно им никаких папок.

Практика показала, что на работу именованых каналов напрямую влияют установленные разрешения на связываемых компьютерах. Так, если с одного компьютера стандартными методами нельзя "зайти" на другой (пример: Гость отключен, расшареных ресурсов нет, вход запаролен), то именованые каналы НЕ работают! При установлении соответсвующих разрешений все работает нормально без изменения вышеизложенного кода...


 
Сергей М. ©   (2008-09-22 14:26) [6]


> расшареных ресурсов нет


Не всякий ресурс есть папка.


> Практика показала


Практика оно конечно хорошо, но начинать надо с теории.

А она, как следует из справки и материалов MSDN, гласит:

If the function fails, the return value is INVALID_HANDLE_VALUE. To get extended error information, call GetLastError.


 
Michael   (2008-09-22 15:19) [7]


> Не всякий ресурс есть папка.

Согласен, некорректно выразился.

> Практика оно конечно хорошо, но начинать надо с теории.А
> она, как следует из справки и материалов MSDN, гласит:If
> the function fails, the return value is INVALID_HANDLE_VALUE.
>  To get extended error information, call GetLastError.

Обратно согласен. Функция CreateFile возвращает ошибку "Не удается найти указанный файл", что ситуацию, вобщем-то, не упрощает. Оно и так было понятно, что клиент не может канал найти.


 
Michael   (2008-09-22 15:24) [8]

Одновременно возникает вопрос: можно ли программно узнать, расшарен ли на требуемой машине какой-либо ресурс? И что можно сделать с разрешениями на доступ? ... хотя это уже хакерство какое-то начинается в чистом виде...


 
Сергей М. ©   (2008-09-22 16:27) [9]


> расшарен ли на требуемой машине какой-либо ресурс?


WNetOpenEnum + WNetEnumResources


> что можно сделать с разрешениями на доступ?


Без наличия прав администратора - ничего.


 
clickmaker ©   (2008-09-22 16:59) [10]

> При установлении соответсвующих разрешений все работает
> нормально без изменения вышеизложенного кода

а если WNetAddConnection к $IPC сделать?


 
Michael   (2008-09-22 19:06) [11]


> а если WNetAddConnection к $IPC сделать?

А можно медленно и два раза? MSDN говорит, что The WNetAddConnection function enables the calling application to connect a local device to a network resource. A successful connection is persistent, meaning that the system automatically restores the connection during subsequent logon operations.
Отсюда понимаю, что соединение происходит автоматически, однако вовсе не вытекает, что функция установит нужные разрешения...
И еще - что такое $IPC?


 
Сергей М. ©   (2008-09-22 19:15) [12]


> что такое $IPC


InterProcess Communication resource



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.098 c
2-1270652923
Vincero
2010-04-07 19:08
2010.08.27
Отловить состояние клавиши [Shift] при нажатии на пункт PopupMenu


15-1264632229
Германн
2010-01-28 01:43
2010.08.27
RDTSC и её использование в VB 2008 Express Edition


3-1238582092
VlGrig1961
2009-04-01 14:34
2010.08.27
При подключении сетевого кабеля не работает база????


3-1240576232
Гарик
2009-04-24 16:30
2010.08.27
Пользователи в Oracle


2-1269192324
Невилл
2010-03-21 20:25
2010.08.27
Delphi2009 и StringGrid





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