我如何使用套接字让多个进程与中央进程通信?

Mik*_*ike 2 unix sockets linux ipc

对于我的应用程序,我需要一个负责与许多客户端进程交互的中央进程.客户端进程需要一种方法来识别中央进程并与之通信.此外,中央进程可能没有运行,客户端进程需要一种方法来识别该事实.这个应用程序将在类Unix系统上运行,所以我考虑使用命名管道套接字来完成任务.具体来说,我将如何使用命名管道套接字执行此任务(实际代码将非常感谢!)?如果命名管道套接字不理想,有更好的替代方案吗?

caf*_*caf 6

命名管道并不是非常理想的 - 它们最适合单读者,单作家情况.

但是,UNIX域套接字非常适合它.它们使用套接字API,端点名称是文件系统条目(与命名管道一样).


这是一个非常简单的例子(您当然希望添加大量的错误检查!).首先是服务器端:

#include <stdio.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>

#define SOCKNAME "/tmp/foo"

int main()
{
    int s1, s2;
    int i;
    struct sockaddr_un sa = { AF_UNIX, SOCKNAME };

    unlink(SOCKNAME);
    s1 = socket(AF_UNIX, SOCK_STREAM, 0);
    bind(s1, (struct sockaddr *)&sa, sizeof sa);
    listen(s1, 5);

    for (i = 0; i < 10; i++)
    {
        struct sockaddr_un sa_client;
        socklen_t sa_len = sizeof sa_client;
        FILE *f;

        s2 = accept(s1, (struct sockaddr *)&sa_client, &sa_len);
        f = fdopen(s2, "r+");
        fprintf(f, "Hello, you are client number %d\n", i + 1);
        fclose(f);
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

现在客户端:

#include <stdio.h>
#include <sys/socket.h>
#include <sys/un.h>

#define SOCKNAME "/tmp/foo"

int main()
{
    int s1;
    struct sockaddr_un sa = { AF_UNIX, SOCKNAME };
    FILE *f;
    char buffer[1024];

    s1 = socket(AF_UNIX, SOCK_STREAM, 0);
    connect(s1, (struct sockaddr *)&sa, sizeof sa);
    f = fdopen(s1, "r+");

    while (fgets(buffer, sizeof buffer, f) != NULL)
    {
        printf("Message received: %s", buffer);
    }

    fclose(f);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

请注意,您应该实际创建套接字/var/run/yourappname而不是in /tmp.

man 7 unix 是进一步调查的好资源.