Andorid进程间通信之 UNIX SOCKET

ops/2024/9/23 4:23:26/

1,什么是UNIX SOCKET
UNIX SOCKET,域套接字,UNIX SOCKET可用于同一台设备进程间通信,它不需要经过网络协议栈,不需要打包拆包、计算校验和、维护序列号应答等,只需要将数据从一个进程复制到另一个进程,有两种类型,字节流套接字和数据报套接字。类似于TCP和UDP,但是面向消息的UNIX socket也是可靠的,消息既不会丢失也不会顺序错乱

2,UNIX SOCKET工作流程图
在这里插入图片描述
3,UNIX SOCKET的方法
使用UNIX SOCKET一般需要包含两个头文件

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>

这里主要说明UNIX SOCKET相比于SOCKET不同的两个方法(传入的参数有差异,方法名是一致的),其它的方法都和SOCKET通讯的方法是一样的。

1,int socket(int domain, int type, int protocol)
该方法用于创建套接字,各参数的含义:

  • domain:使用AF_UNIX或者AF_LOCAL
  • type : 使用SOCK_STREAM(TCP)或者SOCK_DGRAM(UDP)
  • protocol:如果type不是SOCK_RAM,一般是0

domain决定了socket的地址类型。对于AF_UNIX/AF_LOCAL,地址类型为

struct sockaddr_un {sa_family_t  sun_family;       /* AF_UNIX 或 AF_LOCAL */char         sun_path[108];    /* pathname */

socket执行成功的话,返回一个文件描述符,失败的话返回 -1

2,int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
该方法用于对地址进行绑定,各参数的含义如下:

  • sockfd:socket方法创建成功返回的文件描述符
  • addr:地址,对于UNIX SOCKET传入上面sockaddr_un 类型
  • addrlen:地址长度

bind执行成功返回0,失败返回 -1

4,UNIX SOCKET进程间通讯实战
服务端:

#include <stdio.h>
#include <sys/types.h>			/* See NOTES */
#include <sys/socket.h>
#include <sys/un.h>
#include <string.h>
#include <unistd.h>
#define MY_SOCK_PATH "/dev/server-socket"
#define LISTEN_BACKLOG 50int main(){int result;int listenfd,connfd;struct sockaddr_un my_addr,peer_addr;socklen_t peer_addr_size;char buf[512];listenfd = socket(AF_UNIX, SOCK_STREAM, 0);//1,创建套接字,注意传入的参数if(listenfd < 0){printf("socket error!\n");return -1;}memset(&my_addr, 0, sizeof(struct sockaddr_un));my_addr.sun_family = AF_UNIX;strcpy(my_addr.sun_path, MY_SOCK_PATH);socklen_t len = sizeof(my_addr.sun_family)+strlen(MY_SOCK_PATH);unlink(MY_SOCK_PATH);result = bind(listenfd,(struct sockaddr *)&my_addr,len);//2,绑定if(result < 0){printf("bind error!\n");return -1;}printf("bind sucess!\n");result = listen(listenfd, LISTEN_BACKLOG);//3,添加监听if(result<0){printf("listen error!\n");return -1;}printf("listen....!\n");while(1){peer_addr_size = sizeof(struct sockaddr_un);connfd = accept(listenfd, (struct sockaddr *) &peer_addr,&peer_addr_size);//,4,等待客户端连接,返回的是连接的客户端的文件描述符if(connfd < 0){printf("accept error!\n");continue;}while(1){memset(buf,0,sizeof(buf));int len = read(connfd,buf,sizeof(buf));//从客户端读取数据printf("server len:%d\n",len);if(len < 0){printf("read error!\n");break;}else if(len == 0){printf("EOF!\n");break;}else{buf[len] = '\n';printf("server recive buf:%s\n",buf);if(strncmp(buf,"quit",4) == 0){break;}else{buf[0] = 'A';write(connfd,buf,len);//把数据写给客户端}}}close(connfd);}close(listenfd);return 0;
}

客户端:

#include <stdio.h>
#include <sys/types.h>			/* See NOTES */
#include <sys/socket.h>
#include <sys/un.h>
#include <string.h>
#include <unistd.h>#define MY_SOCK_PATH "/dev/server-socket"int main(){int socket_fd,result;struct sockaddr_un my_addr;char buf[512]={0};socket_fd = socket(AF_UNIX, SOCK_STREAM, 0);//1,创建socketif(socket_fd<0){printf("socket error!\n");return -1;}memset(&my_addr, 0, sizeof(struct sockaddr_un));my_addr.sun_family = AF_UNIX;strncpy(my_addr.sun_path, MY_SOCK_PATH,sizeof(my_addr.sun_path) - 1);result =  connect(socket_fd,(struct sockaddr*)&my_addr,sizeof(struct sockaddr_un));//2,连接if(result<0){printf("connect error!\n");return -1;}printf("please input buf:\n");while(fgets(buf,sizeof(buf),stdin) != NULL){write(socket_fd,buf,sizeof(buf));int len = read(socket_fd,buf,sizeof(buf));printf("read len:%d!\n",len);if(len<=0){printf("read error!\n");break;}else{printf("client recive buf:%s\n",buf);}printf("please input buf:\n");}close(socket_fd);return 0;
}

运行结果:

please input buf:
hjd
server len:512
server recive buf:hjdread len:512!
client recive buf:Ajd

可以看到发送给服务端的buf,经过服务端的处理后(将首个字符变成A),返回给了客户端


http://www.ppmy.cn/ops/13138.html

相关文章

中科院1区TOP,上涨4.143分!潜力无限,指标优秀,行业内标志好刊!

本周投稿推荐 SSCI • 2/4区经管类&#xff0c;2.5-3.0&#xff08;录用率99%&#xff09; SCIE&#xff08;CCF推荐&#xff09; • 计算机类&#xff0c;2.0-3.0&#xff08;最快18天录用&#xff09; SCIE&#xff08;CCF-C类&#xff09; • IEEE旗下&#xff0c;1/2…

DSSM 模型技术介绍

转自&#xff1a;git 本文属于新闻推荐实战-召回阶段-DSSM召回模型。区别于策略召回&#xff0c;基于向量召回也是目前工业界常用的一种召回方法。这里我们将介绍一个比较经典的召回模型DSSM&#xff0c;希望读者可以快速掌握模型原理以及细节&#xff0c;同时可以了解具体的实…

北京市工程技术人才职称评价基本标准条件

北京市工程技术人才职称评价基本标准条件链接https://rsj.beijing.gov.cn/ywsite/bjpta/zcps/pstj/202104/P020210427512535371948.pdf类别基本条件业绩条件之一成果备注助理工程师学历和专业工作经历符合下列条件之一&#xff1a;1.硕士研究生毕业后&#xff0c;从事本专业技术…

【软件工程中的增量模型】

文章目录 前言什么是增量模型&#xff1f;增量模型的优点1. 风险控制2. 增量交付3. 可变性4. 提高可维护性 增量模型的缺点1. 需求变更的管理2. 集成测试的复杂性3. 可能的性能问题 前言 增量模型是一种迭代式的软件开发模型&#xff0c;注重将系统划分为多个子系统或模块&…

.net9 AOT编绎生成标准DLL,输出API函数教程-中国首创

1&#xff0c;安装VS2022预览版&#xff08;Visual Studio Preview&#xff09; https://visualstudio.microsoft.com/zh-hans/vs/preview/#download-preview 2&#xff0c;选择安装组件&#xff1a;使用C的桌面开发 和 .NET桌面开发 ------------------------------------- …

大模型引领未来:探索其在多个领域的深度应用与无限可能【第三章、医疗领域:大模型助力医疗健康创新】

大模型引领未来:探索其在多个领域的深度应用与无限可能【第三章、医疗领域:大模型助力医疗健康创新】 三、医疗领域:大模型助力医疗健康创新1.病例分析与辅助诊断的智能化2.药物研发与临床试验的加速3.患者管理与健康监测的个性化4.医疗领域大模型清单三、医疗领域:大模型助…

直接插入排序与希尔排序的详解及对比

目录 1.直接插入排序&#xff08;至少有两个元素才可以使用&#xff09; 排序逻辑 B站动画演示&#xff1a;直接插入排序 逻辑转为代码&#xff1a; 稳定性&#xff1a;稳定 时间复杂度&#xff1a;O(N^2) 空间复杂度&#xff1a;O(1) 应用场景 2.希尔排序&#xff08;对…

前端学习<四>JavaScript——定时器

定时器的常见方法 setInterval()&#xff1a;循环调用。将一段代码&#xff0c;每隔一段时间执行一次。&#xff08;循环执行&#xff09; setTimeout()&#xff1a;延时调用。将一段代码&#xff0c;等待一段时间之后再执行。&#xff08;只执行一次&#xff09; 备注&…