В XP отказано в подключении к удаленным именованным каналам

У меня есть простой дизайн, который я пытаюсь реализовать.

Одно серверное приложение на основе C++ создает именованный канал только для записи. Несколько клиентов (C++ или C#) подключаются только для чтения и прослушивают сообщения о состоянии.

У меня это работает для локальных процессов, но я не могу подключить клиента на другом хосте к серверу.

Сервер работает на XP SP2 (возможно, SP3). Клиент работает на Win7.

    SECURITY_DESCRIPTOR sd;
    SECURITY_ATTRIBUTES sa;
    SID_IDENTIFIER_AUTHORITY siaWorldSidAuthority = SECURITY_WORLD_SID_AUTHORITY;
    PSID psidWorldSid = (PSID) LocalAlloc  (LPTR, GetSidLengthRequired(1));
    InitializeSid(psidWorldSid, &siaWorldSidAuthority, 1);
    *(GetSidSubAuthority(psidWorldSid, 0)) = SECURITY_WORLD_RID;
    InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);
    SetSecurityDescriptorGroup(&sd, psidWorldSid, TRUE);
    ZeroMemory(&sa, sizeof(SECURITY_ATTRIBUTES));
    sa.nLength = sizeof(SECURITY_ATTRIBUTES);
    sa.lpSecurityDescriptor = &sd;
    sa.bInheritHandle = FALSE;

    HANDLE hPipe = CreateNamedPipe(
        lpszPipename,               // name
        PIPE_ACCESS_OUTBOUND,       // write access 
        PIPE_TYPE_MESSAGE |             // message type pipe 
        PIPE_READMODE_MESSAGE |         // message-read mode 
        PIPE_WAIT,                      // blocking mode 
        PIPE_UNLIMITED_INSTANCES,   // max. instances 
        BUFSIZE,                    // output buffer size 
        BUFSIZE,                    // input buffer size 
        PIPE_TIMEOUT,               // client time-out 
        NULL /*&sa*/);                      // no security attribute

замена NULL на &sa в последнем параметре не имеет никакого эффекта. Код клиента C# выглядит следующим образом.

        SafeFileHandle pipeHandle = 
           CreateFile(
              pipeName,
              GENERIC_READ,
              0,
              IntPtr.Zero,
              OPEN_EXISTING,
              0,
              IntPtr.Zero);

Какую глупую очевидную вещь я здесь упускаю?


person Joshua Muskovitz    schedule 06.11.2009    source источник


Ответы (1)


Вы проверили свой брандмауэр? Порт 445 заблокирован?

person Jeff Paquette    schedule 06.11.2009
comment
XP работает на виртуальной машине на хосте Win7. Я считаю, что брандмауэр Windows отключен как на хосте, так и на виртуальной машине. Я считаю, что сетевой адаптер виртуальной машины не выполняет никакой фильтрации. Конечно, слово верить здесь является важным предостережением. - person Joshua Muskovitz; 06.11.2009
comment
С другой стороны, раньше у меня были проблемы, когда и клиент, и сервер находились на одной машине, но вместо канала с именем \\.\pipe\foo я использовал \\12.34.56.78\pipe\foo (ну , конечно же, с фактическим IP-адресом) — похоже, это имело сбои соединения, даже когда оба процесса были локальными. - person Joshua Muskovitz; 06.11.2009
comment
Джош, я нашел эту статью базы знаний об использовании именованных каналов в XP. Требуется некоторая настройка... support.microsoft.com/kb/925890 - person Jeff Paquette; 07.11.2009