gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 11:34:51 26 4
gpt4 key购买 nike

对于我的应用程序,我需要有一个中央进程负责与许多客户端进程进行交互。客户端进程需要一种方式来识别中央进程并与之通信。此外,中央进程可能没有运行,客户端进程需要一种方法来识别这一事实。该应用程序将在类 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com