Можно ли транслировать сообщения в именованном канале между сервером и несколькими клиентами?

Я новичок в каналах и межпроцессном взаимодействии в Windows. Я хочу использовать именованный канал для связи между процессами. Но в моем случае я должен отправить сообщение нескольким клиентам, поэтому я хочу проверить, можно ли отправлять широковещательные сообщения в именованном канале связи. Заранее спасибо.


person lakshmiravali rimmalapudi    schedule 08.11.2020    source источник


Ответы (1)


Этот клиент namedpipe будет транслировать 40 сообщений, одно сообщение в секунду, которое будет получено одним из нескольких серверов, подключенных к одному и тому же каналу.

Клиент NamedPipe

std::wcout << L"I am broadcasting messages!\n"; 
TCHAR                       chReadBuf[_MAX_PATH] = { 0 };
LPTSTR                      lpszWrite= TEXT("Default message from client");
DWORD                       cbRead = 0;
TCHAR                       szTempFolderPath[_MAX_PATH] = { 0 };
TCHAR                       aTempFileName[_MAX_PATH] = { 0 };

for (int i=0; i<40;i++)
{
    std::wcout<< lpszWrite << std::endl;

    CallNamedPipe(L"\\\\.\\pipe\\my_pipe", lpszWrite, (lstrlen(lpszWrite) + 1) * sizeof(TCHAR), chReadBuf, (_MAX_PATH * _MAX_PATH) * sizeof(TCHAR), &cbRead, NMPWAIT_WAIT_FOREVER);
Sleep(1000);
}

Создайте несколько серверов namedpipe, каждый сервер использует один и тот же канал, который используется клиентом namedpipe для широковещательной рассылки сообщений.

Сервер NamedPipe

HANDLE      m_hPipe = nullptr;
m_hPipe = CreateNamedPipe(L"\\\\.\\pipe\\my_pipe", PIPE_ACCESS_DUPLEX, PIPE_TYPE_MESSAGE | PIPE_WAIT, PIPE_UNLIMITED_INSTANCES, MAX_PATH * MAX_PATH, MAX_PATH * MAX_PATH, 100000, NULL);
            
do {
        HRESULT             hr = S_OK;
        TCHAR       chReadBuf[MAX_PATH * MAX_PATH];
        BOOL        fSuccess = FALSE;
        DWORD       cbRead;

        ConnectNamedPipe(m_hPipe, NULL);
    
        fSuccess = ReadFile(
            m_hPipe,      // pipe handle 
            chReadBuf,  // buffer to receive reply 
            (MAX_PATH * MAX_PATH) * sizeof(TCHAR),  // size of buffer 
            &cbRead,  // number of bytes read 
            NULL);    // not overlapped 

        chReadBuf[cbRead] = '\0';
        std::wcout <<L"Received by Server 1" << chReadBuf << std::endl;

        DisconnectPipe();

    } while (1);
  • Обратите внимание, что все ваши серверы должны использовать то же имя канала, что и в приведенном выше коде \\.\pipe\my_pipe
  • Широковещательное сообщение будет получено только одним сервером за раз из нескольких серверов.
person Swapnil Kulkarni    schedule 09.11.2020