簡體   English   中英

是否可以在服務器和多個客戶端之間的命名管道中廣播消息?

[英]Is it possible to broadcast messages in named pipe between a server and multiple clients?

我是 Windows 中管道和進程間通信的新手。 我想使用命名管道在進程之間進行通信。 但在我的情況下,我應該向多個客戶端發送消息,所以我想檢查是否可以在命名管道通信中發送廣播消息。 先感謝您。

這個命名管道客戶端將每秒廣播 40 條消息,一條消息將被連接到同一管道的多個服務器之一接收。

命名管道客戶端

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 客戶端使用它來廣播消息。

命名管道服務器

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 中給出的相同的管道名稱
  • 廣播消息一次只能由一台服務器接收,而不是多台服務器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM