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学习 贝蒂的主页:Betty’s blog 1. 进程终止 1.1 进程退出的场景 进程退出只有以下三种情况: 代码运行完毕,结果正确。代码运行完毕,结果不正确。代码异常终止(进程崩溃)。 1.2 进程退出码 在编程中,我们通常认为main函数是代码的入口,但实际上它只是用户级

java 进程 返回值

实现 Callable 接口 与 Runnable 相比,Callable 可以有返回值,返回值通过 FutureTask 进行封装。 public class MyCallable implements Callable<Integer> {public Integer call() {return 123;}} public static void main(String[] args

C#关闭指定时间段的Excel进程的方法

private DateTime beforeTime;            //Excel启动之前时间          private DateTime afterTime;               //Excel启动之后时间          //举例          beforeTime = DateTime.Now;          Excel.Applicat

linux中使用rust语言在不同进程之间通信

第一种:使用mmap映射相同文件 fn main() {let pid = std::process::id();println!(

java线程深度解析(二)——线程互斥技术与线程间通信

http://blog.csdn.net/daybreak1209/article/details/51307679      在java多线程——线程同步问题中,对于多线程下程序启动时出现的线程安全问题的背景和初步解决方案已经有了详细的介绍。本文将再度深入解析对线程代码块和方法的同步控制和多线程间通信的实例。 一、再现多线程下安全问题 先看开启两条线程,分别按序打印字符串的

列举你能想到的UNIX信号,并说明信号用途

信号是一种软中断,是一种处理异步事件的方法。一般来说,操作系统都支持许多信号。尤其是UNIX,比较重要应用程序一般都会处理信号。 UNIX定义了许多信号,比如SIGINT表示中断字符信号,也就是Ctrl+C的信号,SIGBUS表示硬件故障的信号;SIGCHLD表示子进程状态改变信号;SIGKILL表示终止程序运行的信号,等等。信号量编程是UNIX下非常重要的一种技术。 Unix信号量也可以

Golang进程权限调度包runtime

关于 runtime 包几个方法: Gosched:让当前线程让出 cpu 以让其它线程运行,它不会挂起当前线程,因此当前线程未来会继续执行GOMAXPROCS:设置最大的可同时使用的 CPU 核数Goexit:退出当前 goroutine(但是defer语句会照常执行)NumGoroutine:返回正在执行和排队的任务总数GOOS:目标操作系统NumCPU:返回当前系统的 CPU 核数量 p

如何保证android程序进程不到万不得已的情况下,不会被结束

最近,做一个调用系统自带相机的那么一个功能,遇到的坑,在此记录一下。 设备:红米note4 问题起因 因为自定义的相机,很难满足客户的所有需要,比如:自拍杆的支持,优化方面等等。这些方面自定义的相机都不比系统自带的好,因为有些系统都是商家定制的,难免会出现一个奇葩的问题。比如:你在这款手机上运行,无任何问题,然而你换一款手机后,问题就出现了。 比如:小米的红米系列,你启用系统自带拍照功能后

flume系列之:记录一次flume agent进程被异常oom kill -9的原因定位

flume系列之:记录一次flume agent进程被异常oom kill -9的原因定位 一、背景二、定位问题三、解决方法 一、背景 flume系列之:定位flume没有关闭某个时间点生成的tmp文件的原因,并制定解决方案在博主上面这篇文章的基础上,在机器内存、cpu资源、flume agent资源都足够的情况下,flume agent又出现了tmp文件无法关闭的情况 二、

C++及AIDL服务间通信相关

只做细节展示,没有什么逻辑,陆续补充中