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

相关文章

Windows的CMD窗口如何查看并杀死nginx进程

《Windows的CMD窗口如何查看并杀死nginx进程》:本文主要介绍Windows的CMD窗口如何查看并杀死nginx进程问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Windows的CMD窗口查看并杀死nginx进程开启nginx查看nginx进程停止nginx服务

Java进程CPU使用率过高排查步骤详细讲解

《Java进程CPU使用率过高排查步骤详细讲解》:本文主要介绍Java进程CPU使用率过高排查的相关资料,针对Java进程CPU使用率高的问题,我们可以遵循以下步骤进行排查和优化,文中通过代码介绍... 目录前言一、初步定位问题1.1 确认进程状态1.2 确定Java进程ID1.3 快速生成线程堆栈二、分析

如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socket read timed out的问题

《如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socketreadtimedout的问题》:本文主要介绍解决Druid线程... 目录异常信息触发场景找到版本发布更新的说明从版本更新信息可以看到该默认逻辑已经去除总结异常信息触发场景复

Python多进程、多线程、协程典型示例解析(最新推荐)

《Python多进程、多线程、协程典型示例解析(最新推荐)》:本文主要介绍Python多进程、多线程、协程典型示例解析(最新推荐),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定... 目录一、multiprocessing(多进程)1. 模块简介2. 案例详解:并行计算平方和3. 实现逻

C#通过进程调用外部应用的实现示例

《C#通过进程调用外部应用的实现示例》本文主要介绍了C#通过进程调用外部应用的实现示例,以WINFORM应用程序为例,在C#应用程序中调用PYTHON程序,具有一定的参考价值,感兴趣的可以了解一下... 目录窗口程序类进程信息类 系统设置类 以WINFORM应用程序为例,在C#应用程序中调用python程序

Python如何精准判断某个进程是否在运行

《Python如何精准判断某个进程是否在运行》这篇文章主要为大家详细介绍了Python如何精准判断某个进程是否在运行,本文为大家整理了3种方法并进行了对比,有需要的小伙伴可以跟随小编一起学习一下... 目录一、为什么需要判断进程是否存在二、方法1:用psutil库(推荐)三、方法2:用os.system调用

Java程序进程起来了但是不打印日志的原因分析

《Java程序进程起来了但是不打印日志的原因分析》:本文主要介绍Java程序进程起来了但是不打印日志的原因分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java程序进程起来了但是不打印日志的原因1、日志配置问题2、日志文件权限问题3、日志文件路径问题4、程序

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

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

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

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

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