微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。