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