在Linux环境下实现本机进程间通信(IPC),socket是一种灵活的通信方式。Socket允许在同一台机器上的进程或不同机器间的进程通信。此处我们专注于本机进程间通信。
本机进程间通信通常使用UNIX Domain Sockets,该方式相比网络套接字提供了更高的数据传输效率和安全性,因为它不会将数据通过网络接口发送。
以下是使用C语言在Linux操作系统上通过UNIX Domain Sockets进行进程间通信的示例代码。这个示例将包括一个服务器进程和一个客户端进程。
服务器端:
- 创建一个套接字: 使用
socket()
函数,指定AF_UNIX
作为协议族。 - 绑定套接字: 使用
bind()
函数将套接字绑定到文件系统中的名称(地址)。 - 监听连接: 使用
listen()
函数使服务器套接字监听连接。 - 接受连接: 使用
accept()
函数等待客户端的连接请求。 - 读写数据: 使用
read()
和write()
函数与客户端交换数据。 - 关闭连接: 使用
close()
函数结束连接。
// Server code
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdio.h>
#include <unistd.h>
int main() {
int server_sock, client_sock, len;
struct sockaddr_un server_addr;
char buf[100];
// 创建套接字
server_sock = socket(AF_UNIX, SOCK_STREAM, 0);
server_addr.sun_family = AF_UNIX;
strcpy(server_addr.sun_path, "socketfile");
// 绑定
bind(server_sock, (struct sockaddr *)&server_addr, sizeof(server_addr));
// 监听
listen(server_sock, 5);
// 接受连接
client_sock = accept(server_sock, NULL, NULL);
// 从client读取数据
read(client_sock, buf, sizeof(buf));
// 这里可以处理数据
// 向client写入数据
write(client_sock, buf, sizeof(buf));
// 关闭套接字
close(client_sock);
close(server_sock);
// 删除socket文件
unlink(server_addr.sun_path);
return 0;
}
客户端:
- 创建一个套接字: 使用
socket()
函数. - 连接到服务器: 使用
connect()
函数连接到服务器。 - 读写数据: 使用
write()
和read()
函数与服务器交换数据。 - 关闭套接字: 使用
close()
函数。
// Client code
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdio.h>
#include <unistd.h>
int main() {
int client_sock;
struct sockaddr_un server_addr;
char buf[100];
// 创建套接字
client_sock = socket(AF_UNIX, SOCK_STREAM, 0);
// 指定服务器地址
server_addr.sun_family = AF_UNIX;
strcpy(server_addr.sun_path, "socketfile");
// 连接到服务器
connect(client_sock, (struct sockaddr *)&server_addr, sizeof(server_addr));
// 向服务器发送数据
write(client_sock, "Hello, World!", 13);
// 读取服务器响应
read(client_sock, buf, sizeof(buf));
// 关闭套接字
close(client_sock);
return 0;
}
步骤:
- 编译代码: 使用
gcc -o server server.c
和gcc -o client client.c
来编译上述两个C文件。 - 运行服务器: 在一个终端窗口中运行编译好的服务器程序。
- 运行客户端: 在另一个终端窗口中运行客户端程序,这时它会发送消息给服务器,并收到回复。
这些代码块提供了一个基本的IPC通信模型,可以用作更复杂应用程序的基础。要根据特定需求扩展这些代码,您可能需要考虑错误处理、多线程或多进程并发处理、以及消息编码策略。
云服务器/高防CDN推荐
蓝易云国内/海外高防云服务器推荐
海外免备案云服务器链接:www.tsyvps.com
蓝易云安全企业级高防CDN:www.tsycdn.com
持有增值电信营业许可证:B1-20222080【资质齐全】
蓝易云香港五网CN2 GIA/GT精品网络服务器。拒绝绕路,拒绝不稳定。