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

标签 linux unix sockets ipc

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

最佳答案

命名管道并不是真正的理想选择 - 它们最适合单读取器、单写入器的情况。

然而,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;
}

现在是客户端:

#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;
}

请注意,您实际上应该在 /var/run/yourappname 下而不是在 /tmp 下创建套接字。

man 7 unix 是进一步研究的好资源。

关于linux - 我将如何使用套接字让多个进程与中央进程通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2369066/

相关文章:

python:os.getenv 不返回 sudo?

linux - 使 perl 脚本可执行...我可以取消前面的 'perl' 语句吗?

java - 对于少量 (16 < x < 24) 的同时客户端连接尝试,Windows 主机上的服务器拒绝客户端套接字连接

c++ - 提升 asio 服务器客户端。连接局域网中的两台计算机

linux - 将一个二进制文件的部分 stdout 输出替换为另一个二进制文件的输出的 unix 命令是什么?

c# - 客户端无法从服务器读取多条消息 (C#)

linux - 如何替换某种形式的部分线条?

linux - cloudera 安装中的 PIG_HOME、PIG_INSTALL 是什么?

python - 在文件第 8 行写入文本

Perl:将子标准输出通过管道传输到父进程