Конференция "WinAPI" » Вопросы про Names Pipe
 
  • Дмитрий С © (14.12.11 18:46) [0]
    Изучаю данную тему.
    Первым что прочитал - статья Игоря Шевченко, затем MSDN.

    Итак по-порядку.

    === 1 вопрос ===
    Жизненный цикл pipe-сервера представляет собой, как я понял, следующий вид (синхронный режим):
    1. hPipe = CreateNamedPipe
    2. ConnectNamedPipe(hPipe)
    3. CreateThread(hPipe)
    4. Переход в пункт 1.

    В потоке происходит работа с каналом и его закрытие:
    FlushFileBuffers(hPipe);
    DisconnectNamedPipe(hPipe);
    CloseHandle(hPipe);

    Про ConnectNamedPipe, написано, что она возвращает False, если клиент подключился между вызовами CreateNamedPipe и ConnectNamedPipe (пункты 1 и 2 в списке).

    Возникает следующий вопрос, а что будет если два клиента подключатся почти одновременно, так, что второй клиент подключится после вызова ConnectNamedPipe, но перед новым вызовом CreateNamedPipe?

    === 2 вопрос ===
    Вопрос касается примера Игоря Шевченко.
    http://www.delphimaster.ru/articles/named_pipes/
    Пример, как написано в статье, асинхронной работы с каналами. Я тоже хочу использовать асинхронный режим работы, чтобы иметь возможность корректно выходить из потока.

    Но в примере используется синхронный вызов:

     // Ожидаем подключения клиента.
     ConnectNamedPipe(hPipe, nil);


    После чего поток заблокируется на этой строке до подключения нового клиента, а значит не даст себя корректно завершить.
    Вопрос, каким образом можно разблокировать (или не блокировать) этот вызов?
    Какой вариант наиболее приемлем:
    - Использовать OVERLAPPED структуру,
    - Для корректного завершения потока просто выполнить CloseHandle (hPipe), после чего вызов ConnectNamedPipe разблокируется с ошибкой,
    - или Фиктивно подключится к каналу?

    В MSDN для функции ConnectNamedPipe  написано следующее: Note  Nonblocking mode is supported for compatibility with Microsoft LAN Manager version 2.0, and it should not be used to achieve asynchronous input and output (I/O) with named pipes.
    Я так и не понял точно, что это означает, прошу уточнить: Функцию ConnectNamedPipe нельзя использовать в асинхронном режиме или вообще работа с каналами недопустима в асинхронном режиме?

    P.S. В коде, возможно ошибка. Неправильный порядок вызовов: сначала закрываем указатель, затем используем его.

     CloseHandle (hPipe);
     CloseHandle (hEventRd);
     CloseHandle (hEventWrt);
     DisconnectNamedPipe (hPipe);  // Разрушаем экземпляр канала



    На этом пока все. Спасибо заранее за терпение.
  • Дмитрий С © (14.12.11 18:49) [1]
    *Named Pipes, конечно же
  • Rouse_ © (14.12.11 19:10) [2]
  • Дмитрий С © (15.12.11 11:53) [3]

    > Rouse_ ©   (14.12.11 19:10) [2]

    Спасибо за пример, так и думал, Саня плохого не посоветует:)

    Но вопросы остаются, по крайней мере первый:)
  • Дмитрий С © (15.12.11 12:47) [4]
    А еще вопрос. Если клиент пришлет пакет больше чем MAXWORD, сервер его нормально обработает?
  • Rouse_ © (15.12.11 14:25) [5]

    > Дмитрий С ©   (15.12.11 12:47) [4]
    >
    > Если клиент пришлет пакет больше чем MAXWORD,
    >  сервер его нормально обработает?

    Не тестировал.
    Вообще вот тут есть ограничение:
    http://msdn.microsoft.com/en-us/library/windows/desktop/aa365747%28v=VS.85%29.aspx

    "Pipe write operations across a network are limited to 65,535 bytes per write. For more information regarding pipes, see the Remarks section."

    Правда нужно проверить, работает ли это ограничение локально...
 
Конференция "WinAPI" » Вопросы про Names Pipe
Есть новые Нет новых   [134431   +5][b:0][p:0.001]