【问题标题】:accept() in message queues IPC UNIX消息队列中的 accept() IPC UNIX
【发布时间】:2013-05-14 14:32:00
【问题描述】:
for (;;)
{
    if (msgrcv(msqid, &flag, sizeof(struct flags) - sizeof(long), 1, IPC_NOWAIT)>0)
           break;
}
    msgsnd(msqid, &message , sizeof(struct messages) - sizeof(long), 0);

有没有像sockets IPC 中的accept() 函数,但对于message queues IPC? 我的服务器应该等待客户端连接,并且只有在客户端连接时才将数据发送回它。 我特别从客户端发送一些无用的数据并在无限循环中检查数据(这意味着客户端已连接,我知道这是非常愚蠢的算法)。

【问题讨论】:

标签: c++ c linux unix ipc


【解决方案1】:

不,没有任何直接类似的东西。消息队列更像是无连接的数据报套接字,而不是面向连接的流套接字(支持accept() 等等)。

一些实现(z/OS?)公开了msgrcv 上阻塞的进程数,这与您正在寻找的类似,但这不是可移植的。

在我看来,您有两个简单的选择。

首先,做你正在做的事情,但不要在服务器的msgrcv 中进行 IPC_NOWAIT。如果您什么都不做,那么循环旋转毫无意义。只是阻塞,直到客户宣布自己。 (并且使用不同的消息类型进行客户端到服务器和服务器到客户端的通信——你不希望客户端将他们的消息消费到服务器,反之亦然。)

其次,切换到 AF_UNIX 流套接字,这将为您提供accept()able 语义。

【讨论】:

    猜你喜欢
    • 2019-08-21
    • 2012-09-19
    • 2021-03-12
    • 1970-01-01
    • 2011-02-20
    • 2021-06-24
    • 2013-01-05
    • 2011-06-01
    • 1970-01-01
    相关资源
    最近更新 更多