Andorid进程间通信之 UNIX SOCKET

2024-04-25 13:52

本文主要是介绍Andorid进程间通信之 UNIX SOCKET,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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),返回给了客户端

这篇关于Andorid进程间通信之 UNIX SOCKET的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/934870

相关文章

Linux中的进程间通信之匿名管道解读

《Linux中的进程间通信之匿名管道解读》:本文主要介绍Linux中的进程间通信之匿名管道解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、基本概念二、管道1、温故知新2、实现方式3、匿名管道(一)管道中的四种情况(二)管道的特性总结一、基本概念我们知道多

Linux进程终止的N种方式详解

《Linux进程终止的N种方式详解》进程终止是操作系统中,进程的一个重要阶段,他标志着进程生命周期的结束,下面小编为大家整理了一些常见的Linux进程终止方式,大家可以根据需求选择... 目录前言一、进程终止的概念二、进程终止的场景三、进程终止的实现3.1 程序退出码3.2 运行完毕结果正常3.3 运行完毕

Windows命令之tasklist命令用法详解(Windows查看进程)

《Windows命令之tasklist命令用法详解(Windows查看进程)》tasklist命令显示本地计算机或远程计算机上当前正在运行的进程列表,命令结合筛选器一起使用,可以按照我们的需求进行过滤... 目录命令帮助1、基本使用2、执行原理2.1、tasklist命令无法使用3、筛选器3.1、根据PID

linux本机进程间通信之UDS详解

《linux本机进程间通信之UDS详解》文章介绍了Unix域套接字(UDS)的使用方法,这是一种在同一台主机上不同进程间通信的方式,UDS支持三种套接字类型:SOCK_STREAM、SOCK_DGRA... 目录基础概念本机进程间通信socket实现AF_INET数据收发示意图AF_Unix数据收发流程图A

Python中多线程和多进程的基本用法详解

《Python中多线程和多进程的基本用法详解》这篇文章介绍了Python中多线程和多进程的相关知识,包括并发编程的优势,多线程和多进程的概念、适用场景、示例代码,线程池和进程池的使用,以及如何选择合适... 目录引言一、并发编程的主要优势二、python的多线程(Threading)1. 什么是多线程?2.

linux进程D状态的解决思路分享

《linux进程D状态的解决思路分享》在Linux系统中,进程在内核模式下等待I/O完成时会进入不间断睡眠状态(D状态),这种状态下,进程无法通过普通方式被杀死,本文通过实验模拟了这种状态,并分析了如... 目录1. 问题描述2. 问题分析3. 实验模拟3.1 使用losetup创建一个卷作为pv的磁盘3.

Linux环境变量&&进程地址空间详解

《Linux环境变量&&进程地址空间详解》本文介绍了Linux环境变量、命令行参数、进程地址空间以及Linux内核进程调度队列的相关知识,环境变量是系统运行环境的参数,命令行参数用于传递给程序的参数,... 目录一、初步认识环境变量1.1常见的环境变量1.2环境变量的基本概念二、命令行参数2.1通过命令编程

Linux之进程状态&&进程优先级详解

《Linux之进程状态&&进程优先级详解》文章介绍了操作系统中进程的状态,包括运行状态、阻塞状态和挂起状态,并详细解释了Linux下进程的具体状态及其管理,此外,文章还讨论了进程的优先级、查看和修改进... 目录一、操作系统的进程状态1.1运行状态1.2阻塞状态1.3挂起二、linux下具体的状态三、进程的

python多进程实现数据共享的示例代码

《python多进程实现数据共享的示例代码》本文介绍了Python中多进程实现数据共享的方法,包括使用multiprocessing模块和manager模块这两种方法,具有一定的参考价值,感兴趣的可以... 目录背景进程、进程创建进程间通信 进程间共享数据共享list实践背景 安卓ui自动化框架,使用的是

C#如何优雅地取消进程的执行之Cancellation详解

《C#如何优雅地取消进程的执行之Cancellation详解》本文介绍了.NET框架中的取消协作模型,包括CancellationToken的使用、取消请求的发送和接收、以及如何处理取消事件... 目录概述与取消线程相关的类型代码举例操作取消vs对象取消监听并响应取消请求轮询监听通过回调注册进行监听使用Wa