在这篇文章中笔者将以socket应用为重点, 跟大家分享一下socket的应用. 我们都知道socket是通信套接字, 其实socket的应用不仅可以用在网络通信中, 本地进程通信也可以使用socket来实现.
什么是基于socket的IPC
IPC 通信有多种实现方式, 从大的类别上可以分为基于文件的IPC 和 基于内存的IPC. 基于文件的IPC又分为基于有序文件和基于无序文件. 基于有序文件的实现方式又分为管道和socket. 本文主要说的就是基于socket有序文件的IPC.
通过对等模型建立socket的IPC
建立socket, 在内存中开辟一块空间, 返回一个文件描述符号.这块内存空间可以指向本地文件或者网卡设备(这个取决于绑定的地址, 地址唯一决定了一个物理设备). 如果是本地文件, 系统会自动创建一个socket文件. 如果是网卡, socket开辟的这片内存空间指向的就是一个ip地址.
向socket开辟的内存中写数据,如果bind的是本地文件, 内存中的数据就会记录到本地socket文件中, 如果bind的地址是网卡, 内存中的数据就会发送给网卡.
接收端进程
int fd = socket(AF_UNIX,SOCK_DGRAM,0);
if(fd == -1){
printf("socket error: %m \n");
exit(-1);
}
printf("socket success! \n");
//2, 构造本地文件地址
struct sockaddr_un addr = {0};
addr.sun_family = AF_UNIX;
memcpy(addr.sun_path,"IPC.sock", strlen("IPC.sock"));
//3, 把socket绑定在地址上
r = bind(fd, (struct sockaddr*)&addr, sizeof(addr));
if(r == -1) {
printf("bind error: %m \n");
close(fd);
exit(-1);
}
printf("bind success ! \n");
//4, 接收数据
char buf[200];
while(1){
bzero(buf, sizeof(buf));
r = read(fd, buf, sizeof(buf));// 从fd中读取数据放入buf中, 读取的长度是sizeof(buf)
buf[r] = 0;
printf("%s\n", buf);
}
//5, 关闭
close(fd);
//6, 删除socket 文件
unlink("IPC.sock");
发送端进程
int fd;
int r;
struct sockaddr_un addr = {0};
//1, ��socket��
fd = socket(AF_UNIX, SOCK_DGRAM, 0);
//2, ������������������������连接
addr.sun_family = AF_UNIX;
memcpy(addr.sun_path, "IPC.sock", strlen("IPC.sock"));
r = connect(fd, (struct sockaddr*)&addr, sizeof(addr));
//3, ������������发送数据
write(fd, "hello! Alice!", strlen("hello! Alice!"));
//4, ����关闭网络
close(fd);