在linux上的进程之间共享套接字

时间:2012-06-26 14:01:10

标签: linux sockets network-programming

我有多个守护进程(一个网关和多个服务,都在同一节点上运行),其中一些服务守护进程需要响应"软实时"对于网络上的到达请求,我的拱门就像我有一个网关守护进程,它根据一些协议标签将传入的数据包路由到相应的服务守护进程。服务守护程序处理请求并将响应发送回gw守护程序,该守护程序将打开。一切都很好,工作但我没有实现"软实时"并看到滞后。

我打算以下面的方式对此进行即兴创作,共享网关和服务守护进程之间的网络连接,我将有一个通知方案,当数据包到达连接时,gw守护进程不会对数据包进行排队从套接字队列查看协议头和"通知"数据已到达的相应服务守护程序",在接收到通知时,服务守护程序获取二进制信号量并从套接字队列中对数据进行解除队列。将有2个这样的信号量用于写入,另一个用于阅读。当服务守护进程需要发送数据时,它会抓取写信号量并发送数据。当它收到"数据到达时#34;来自网关守护程序的通知,它抓取读取的信号量并从套接字中取消数据的队列。在每个新的连接请求中,网关守护程序将使用" sendmsg"将连接发送到服务守护程序。

有没有人随时试过这个计划?你觉得这种方法有什么问题吗?请评论/建议。

1 个答案:

答案 0 :(得分:1)

如果你想避免复制开销,你可能应该使用splice,而不是尝试在多个守护进程之间共享套接字。该解决方案将非常难以调试和维护。

我希望(并希望)您的网络协议有一个标头,使网关可以轻松地知道将数据包路由到哪里,然后是发往服务守护程序的有效负载。

在伪代码中,网关执行此操作:

while (data on socket)
{
    header = read(socket, sizeof(header));

    service_socket = find_service(header);
    splice(socket, NULL, service_socket, NULL, header->payload_length, 0);
}