实现进程之间的通信需要创建两个进程,假设进程A、进程B
步骤:
进程A:(1)、 创建socket对象 。(2)、准备通信地址(本地socket文件) 。(3)、 绑定sokect对象和地址。(4)、监听、 等待连接。(5)、接收\发送数据。(6)、 关闭socket、删除socket文件
进程B:(1)、创建socket对象。(2)、准备通信地址。(3)、连接。(4)、发送\接收数据。(5)、关闭socket
演示一个基础代码A进程
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>
int main(int argc,const char* argv[])
{
// 创建socket
int sockfd = socket(AF_LOCAL,SOCK_STREAM,0);
if(0 > sockfd)
{
perror("socket");
return EXIT_FAILURE;
}
// 准备通信地址
struct sockaddr_un addr = {};
addr.sun_family = AF_LOCAL;
strcpy(addr.sun_path,"sock");
socklen_t addrlen = sizeof(addr);
// 绑定socket和通信地址 绑定成功 socket文件就会创建
if(bind(sockfd,(struct sockaddr*)&addr,addrlen))
{
perror("bind");
return EXIT_FAILURE;
}
// 监听
if(listen(sockfd,5))
{
perror("listen");
return EXIT_FAILURE;
}
printf("等待连接中...\n");
// 等待连接
int acc_fd = accept(sockfd,NULL,NULL);
if(0 > acc_fd)
{
perror("accept");
return EXIT_FAILURE;
}
char buf[4096] = {};
printf("有进程连接了...\n");
for(;;)
{
// 接受数据
printf("recv...\n");
ssize_t size = recv(acc_fd,buf,sizeof(buf),0);
if(0 >= size)
{
perror("recv");
break;
}
if(0 == strncmp(buf,"quit",4))
{
printf("对方结束通信\n");
break;
}
printf("recv:%s\n>>>",buf);
// 发送数据
scanf("%s",buf);
size = send(acc_fd,buf,strlen(buf)+1,0);
if(0 > size)
{
perror("send");
break;
}
if(0 == strncmp(buf,"quit",4))
{
printf("我方结束通信\n");
break;
}
}
// 关闭socket
close(acc_fd);
close(sockfd);
// 删除socket文件
unlink(addr.sun_path);
}
B进程
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>
int main(int argc,const char* argv[])
{
// 创建socket
int sockfd = socket(AF_LOCAL,SOCK_STREAM,0);
if(0 > sockfd)
{
perror("socket");
return EXIT_FAILURE;
}
// 准备通信地址
struct sockaddr_un addr = {};
addr.sun_family = AF_LOCAL;
strcpy(addr.sun_path,"sock");
socklen_t addrlen = sizeof(addr);
printf("连接中...\n");
// 连接
if(connect(sockfd,NULL,NULL));
{
perror("connect");
return EXIT_FAILURE;
}
char buf[4096] = {};
printf("有进程连接了...\n");
for(;;)
{
// 发送数据
scanf("%s",buf);
size = send(acc_fd,buf,strlen(buf)+1,0);
if(0 > size)
{
perror("send");
break;
}
if(0 == strncmp(buf,"quit",4))
{
printf("我方结束通信\n");
break;
}
// 接受数据
printf("recv...\n");
ssize_t size = recv(acc_fd,buf,sizeof(buf),0);
if(0 >= size)
{
perror("recv");
break;
}
if(0 == strncmp(buf,"quit",4))
{
printf("对方结束通信\n");
break;
}
printf("recv:%s\n>>>",buf);
}
// 关闭socket
close(acc_fd);
close(sockfd);
}