Andorid进程间通信之 UNIX SOCKET

news2025/1/17 0:18:36

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 50

int 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,创建socket

	if(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:hjd

read len:512!
client recive buf:Ajd

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1622971.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

xray使用入门

简介 长亭科技旗下的一款网络安全漏洞扫描工具&#xff0c;用于检测和评估web应用程序的安全性。具有一下特点&#xff1a;检测速读快、检查范围广、代码质量高、高级可定制以及安全无危害。属于不开源的项目&#xff0c;用户直接下载xray的可执行文件&#xff0c;即可运行该工…

SSH远程连接docker容器-Linux-SSH -L 打隧道

问题&#xff1a;在物理机上用podman创建了一个容器&#xff0c;想SSH直接远程连接docker容器 解决方式&#xff1a; 步骤1: 在本地terminal输入以下命令&#xff1a; ssh -L 容器端口号:localhost:容器端口号 物理机用户名物理机ip -p 物理机端口号 即可&#xff0c;可新打…

1、k8s问题pod从service中剔除

一、起因 redis原来由两服务器的集群变为三服务器的集群&#xff0c;通过statefulset扩展了两节点&#xff0c;并把redis-app-0和redis-app-3从集群中去除&#xff0c;但是由于service路由后端不变&#xff0c;导致程序连接后端仍然可能到redis-app-0和redis-app-3 二、处理 …

WiFi、Ethenet、4G优先级切换

1、多网卡情况下如何调整优先级方案 按照目前公司前辈给出的方案&#xff0c;调整优先级的手段有两种&#xff1a; <1>.删除默认路由--route del 的方法 <2>.ifmetric源码提供的修改路由表的mteric的值来设置路由的优先级&#xff0c;metric越小优先级越高。 应…

C#开发中关于业务类与窗口文件以及数据库的大体连接流程(业务类的写法)

所有的开发在基准上&#xff0c;都是数据的交互&#xff0c;在VS中基于WinFrm的C#开发可以采用业务类与窗口类分开&#xff0c;以形成模块&#xff0c;接下来简述大体开发流程 业务类中&#xff0c;我们需要继承EntityClass类&#xff0c;来形成与窗口类的接口&#xff1a; pu…

Spring 事务 @Transactional 注解

上期我们讲解了Spring事务的两种实现&#xff0c;其中声明式注解使用了 Transactional 注解&#xff0c; 接下来我们学习 该注解的使用细节。 我们主要学习 Transactional注解当中的三个常见属性&#xff1a; rollbackFor&#xff1a;异常回滚属性&#xff0c;指定能够出发事…

河道采砂执法监管信息化平台:科技赋能,智慧监管

随着信息技术的飞速发展&#xff0c;信息化平台已经成为提升行业监管效率和水平的重要工具。河道采砂作为水利资源管理的重要环节&#xff0c;其执法监管同样需要与时俱进&#xff0c;利用先进技术手段提升监管效能。河道采砂执法监管信息化平台便是这一背景下的产物&#xff0…

【总结】hbase master重启恢复失败问题修复

问题现象 最近hbase master 莫名其妙宕机了&#xff0c;查看最后输出日志&#xff0c;也没有发现有效信息。 于是想着先重启一把&#xff0c;在hbase master 选主成active状态的过程中&#xff0c;发现重启多次都很漫长&#xff0c;且最终因重启时间过长&#xff0c;被hbase-…

基于STM32的蓝牙小车(虚拟串口模拟)的Proteus仿真

文章目录 一、前言二、仿真图1.要求2.思路3.画图3.1 电源部分3.2 超声波测距部分3.3 电机驱动部分3.4 按键部分3.5 蓝牙部分3.6 显示屏部分3.7 整体 4.仿真5.软件 三、总结 一、前言 proteus本身并不支持蓝牙仿真&#xff0c;这里我采用虚拟串口的方式来模拟蓝牙控制。 这里给…

了解网卡、光猫、路由器

了解网卡、光猫、路由器 一、网卡二、光猫三、路由器四、光猫和路由器的联系和区别五、家庭正常上网的简单流程六、企业正常上网的简单流程 一、网卡 网卡&#xff1a;用来允许计算机在计算机网络上进行通讯的计算机硬件 一般来说&#xff0c;笔记本都有两种网卡&#xff0c;有…

栈和队列--数据结构

栈&#xff08;Stsck&#xff09; 概念 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵循“后进先出”&#xff08;LIFO&#xff09;的原则。 …

性价比高超声波清洗机品牌有哪些?四款高性价比超声波清洗机安利

如果你经常不清洗眼镜&#xff0c;那么非常推荐你入手一台超声波清洗机在家清洗眼镜&#xff01;因为&#xff0c;超声波清洗机清洗眼镜真的非常方便。如果你经常佩戴眼镜&#xff0c;但是常常忘记清洗的话&#xff0c;看完这篇文章后一定要改掉不清洗眼镜的坏习惯&#xff0c;…

ffmpeg的安装以及使用

1.FFmpeg 的主要功能和特性&#xff1a; 格式转换&#xff1a;FFmpeg 可以将一个媒体文件从一种格式转换为另一种格式&#xff0c;支持几乎所有常见的音频和视频格式&#xff0c;包括 MP4、AVI、MKV、MOV、FLV、MP3、AAC 等。视频处理&#xff1a;FFmpeg 可以进行视频编码、解…

数码相机数据恢复,3招找回珍贵照片!

“我有一部数码相机&#xff0c;存储了很多很重要的文件和数据。但是我一不小心就误删了里面的重要数据&#xff0c;有什么方法可以恢复相机里的文件吗&#xff1f;” 数码相机已成为我们日常生活中不可或缺的一部分&#xff0c;它帮助我们记录生活的点滴&#xff0c;留下美好的…

SSL证书一年要多少钱

经常会被人问道&#xff1a;“安装SSL证书一年得要多少钱&#xff1f;”其实证书的类型不同、功能不同、品牌不同&#xff0c;证书的价格也会不一样。SSL证书的价格因其类型、品牌、购买渠道以及所包含的服务和支持等因素而有所不同。通常一年的费用从几十元到几万元不等。 一…

ABAP Visual Code 新建sap系统连接

本文主要介绍如何新建SAP前端系统链接 前提是你已经都扩展完了 1.点击SAP fiori--》点击新建 2.选择 abap on premise 3.输入如下信息 4.这里介绍下URL 如何获取 SMICM-->点击service 明细里面可以看到你的host name 和 port 当然你也可以随便找一个你的odata 服务看下ur…

在vscode使用MATLAB

官方链接 首先安装好vscode、python 与 MATLAB&#xff0c;注意python与MATLAB的版本&#xff0c;参考链接 都安装好后 验证&#xff1a; 安装插件&#xff1a;matlab in vscode &#xff0c;并进行如下设置&#xff0c;参考链接 至此就差不多OK了

Uvicorn+Gunicorn+FastAPI学习笔记

WSGI Web服务器网关接口(Python Web Server Gateway Interfeace&#xff0c;缩写WSGI)是为python定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口。 Gunicorn Gunicorn是一个基于Python的WSGI&#xff08;Web服务器网关接口&#xff09;HTTP服务器&#xff0…

看完马云的简历,我明白了为什么他对钱没有兴趣。。。

程序员的成长之路 互联网/程序员/技术/资料共享 关注 阅读本文大概需要 2.8 分钟。 来自&#xff1a;网路 马云的人生故事&#xff0c;如同一部传奇&#xff0c;充满着坎坷、奋斗和成功。 尽管他早年的高考经历并不顺利&#xff0c;但他的坚韧和梦想驱使着他不断前行&#xff…

算法-KMP算法

时间复杂度&#xff1a; public int strStr(String haystack, String needle) {int[] next new int[needle.length()];//next数组的生成next[0] 0;int prefixLen 0;//共同前后缀长度int i 1, j 1;//i,j复用while (i < needle.length()) {if (needle.charAt(prefixLen)…