是否可以在服务器和多个客户端之间的命名管道中广播消息?

问题描述

我是Windows管道和进程间通信的新手。我想使用命名管道在进程之间进行通信。但就我而言,我应该将消息发送到多个客户端,因此我想检查是否可以通过命名管道通信发送广播消息。 预先谢谢你。

解决方法

这个命名管道客户端每秒将广播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);
}

创建多个命名管道服务器,每个服务器使用相同的管道,命名管道客户端将其用于广播消息。

命名管道服务器

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,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
  • 中指定的相同管道名称
  • 广播的消息一次只能由多台服务器中的一台服务器接收。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...