Конференция "Сети" » Именованые каналы - сетевое использование [D7, WinXP]
 
  • Michael (22.09.08 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". При таком подходе соединени не происходит - оба процесса "подвисают".
    Подскажите, в чем может быть проблема? В аттрибутах? Но в локальном режиме все работает... На мсдн'е клиент тоже имеет точку в имени сервера. Но, насколько я понимаю - это касается только локального варианта.
  • Сергей М. © (22.09.08 11:45) [1]
    Начнем с того, что WinAPI-функции при их нормальном выполнении не генерируют исключительных ситуаций, так что заключение этих ф-ций в try..except-блок лишен смысла.
  • Сергей М. © (22.09.08 11:54) [2]

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


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

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

    А ты осознаешь разницу между HostName и ComputerName ?
  • Michael (22.09.08 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 - сетевое имя компьютера, то я имел в виду второе. В противном случае - разъясните, пожалуйста.
  • Сергей М. © (22.09.08 13:17) [4]

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


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


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


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


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


    А еще точнее - NetBIOS-имя компьютера.
    То самое, которое фигурирует в Сетевом окружении.
  • Michael (22.09.08 14:16) [5]

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

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

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


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


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


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

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

    If the function fails, the return value is INVALID_HANDLE_VALUE. To get extended error information, call GetLastError.
  • Michael (22.09.08 15:19) [7]

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

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

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

    Обратно согласен. Функция CreateFile возвращает ошибку "Не удается найти указанный файл", что ситуацию, вобщем-то, не упрощает. Оно и так было понятно, что клиент не может канал найти.
  • Michael (22.09.08 15:24) [8]
    Одновременно возникает вопрос: можно ли программно узнать, расшарен ли на требуемой машине какой-либо ресурс? И что можно сделать с разрешениями на доступ? ... хотя это уже хакерство какое-то начинается в чистом виде...
  • Сергей М. © (22.09.08 16:27) [9]

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


    WNetOpenEnum + WNetEnumResources


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


    Без наличия прав администратора - ничего.
  • clickmaker © (22.09.08 16:59) [10]
    > При установлении соответсвующих разрешений все работает
    > нормально без изменения вышеизложенного кода

    а если WNetAddConnection к $IPC сделать?
  • Michael (22.09.08 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?
  • Сергей М. © (22.09.08 19:15) [12]

    > что такое $IPC


    InterProcess Communication resource
 
Конференция "Сети" » Именованые каналы - сетевое использование [D7, WinXP]
Есть новые Нет новых   [134432   +19][b:0][p:0.003]