-
Добрый день! Проблема при использовании именованых каналов: в локальном режиме (на одной машине) работает, в сетевом - нет. Сервер создает соединение так:
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;
try
FPipeHandle := CreateNamedPipe( FServerName, PIPE_ACCESS_DUPLEX, PIPE_WAIT or PIPE_TYPE_BYTE or
PIPE_READMODE_BYTE,
1, 500, 500, 1000, @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". При таком подходе соединени не происходит - оба процесса "подвисают". Подскажите, в чем может быть проблема? В аттрибутах? Но в локальном режиме все работает... На мсдн'е клиент тоже имеет точку в имени сервера. Но, насколько я понимаю - это касается только локального варианта.
-
Начнем с того, что WinAPI-функции при их нормальном выполнении не генерируют исключительных ситуаций, так что заключение этих ф-ций в try..except-блок лишен смысла.
-
> оба процесса "подвисают"
Серверный "подвисает" на выполнении ConnectNamedPipe : для синхронного блокирующего режима это абсолютно нормальное поведение- сервер не обнаруживает ни одного входящего клиентского запроса на соединение и ждет пока таковой будет обнаружен.
Клиентский "подвисает" в бесконечном repeat-цикле, потому что условие FPipeHandle <> INVALID_HANDLE_VALUE остается ложным сколь-либо долго - видимо, потому что серверный компютер с именем ServerHostName не существует.
А ты осознаешь разницу между HostName и ComputerName ?
-
> Сергей М. © (22.09.08 11:45) [1] > Начнем с того, что WinAPI-функции при их нормальном выполнении > не генерируют исключительных ситуаций, так что заключение > этих ф-ций в try..except-блок лишен смысла.
Спасибо, учту.
> Серверный "подвисает" на выполнении ConnectNamedPipe : для > синхронного блокирующего режима это абсолютно нормальное > поведение- сервер не обнаруживает ни одного входящего клиентского > запроса на соединение и ждет пока таковой будет обнаружен. >
Этот момент мне понятен. Поведение сервера при ожидании подключения клиента не отличается в обоих случаях.
> Клиентский "подвисает" в бесконечном repeat-цикле, потому > что условие FPipeHandle <> INVALID_HANDLE_VALUE остается > ложным сколь-либо долго - видимо, потому что серверный компютер > с именем ServerHostName не существует.
Собственно, в этом и заключается проблема. Серверный компьютер с именем, передаваемым в переменной ServerHostName существует. Связь есть. Наткнулся на мнение, что именованым каналам нужно: а) Наличие хоть по одной расшареной папки б) Наличие взаимных разрешений на доступ к этим папкам Буду пробовать.
> А ты осознаешь разницу между HostName и ComputerName
Не совсем... Если под HostName подразумевается IP-шник, а под ComputerName - сетевое имя компьютера, то я имел в виду второе. В противном случае - разъясните, пожалуйста.
-
> именованым каналам нужно: > а) Наличие хоть по одной расшареной папки > б) Наличие взаимных разрешений на доступ к этим папкам
Не нужно им никаких папок.
> под HostName подразумевается IP-шник
Не "IP-шник", а доменное имя хоста (см. DNS)
> ComputerName - сетевое имя компьютера
А еще точнее - NetBIOS-имя компьютера. То самое, которое фигурирует в Сетевом окружении.
-
> Не нужно им никаких папок.
Практика показала, что на работу именованых каналов напрямую влияют установленные разрешения на связываемых компьютерах. Так, если с одного компьютера стандартными методами нельзя "зайти" на другой (пример: Гость отключен, расшареных ресурсов нет, вход запаролен), то именованые каналы НЕ работают! При установлении соответсвующих разрешений все работает нормально без изменения вышеизложенного кода...
-
> расшареных ресурсов нет
Не всякий ресурс есть папка.
> Практика показала
Практика оно конечно хорошо, но начинать надо с теории.
А она, как следует из справки и материалов MSDN, гласит:
If the function fails, the return value is INVALID_HANDLE_VALUE. To get extended error information, call GetLastError.
-
> Не всякий ресурс есть папка.
Согласен, некорректно выразился.
> Практика оно конечно хорошо, но начинать надо с теории.А > она, как следует из справки и материалов MSDN, гласит:If > the function fails, the return value is INVALID_HANDLE_VALUE. > To get extended error information, call GetLastError.
Обратно согласен. Функция CreateFile возвращает ошибку "Не удается найти указанный файл", что ситуацию, вобщем-то, не упрощает. Оно и так было понятно, что клиент не может канал найти.
-
Одновременно возникает вопрос: можно ли программно узнать, расшарен ли на требуемой машине какой-либо ресурс? И что можно сделать с разрешениями на доступ? ... хотя это уже хакерство какое-то начинается в чистом виде...
-
> расшарен ли на требуемой машине какой-либо ресурс?
WNetOpenEnum + WNetEnumResources
> что можно сделать с разрешениями на доступ?
Без наличия прав администратора - ничего.
-
> При установлении соответсвующих разрешений все работает > нормально без изменения вышеизложенного кода
а если WNetAddConnection к $IPC сделать?
-
> а если 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?
-
> что такое $IPC
InterProcess Communication resource
|