ARM环境中的c语言socket进程通信-转
近由于需要弄一些android底层的进程间通讯的东西,所以重温了一下linux的进程通信知识。
进程间通信有很多种方法,使用socket只是其中的一种方法,使用socket的好处呢,就是通用,代码可以在很多平台上直接编译,效率也很高的。
实际上,在android系统中,绝大多数的API 都使用了socket与底层的本地服务通信,这样做到了应用程序接口和底层框架分离的原则。用这种方式封装的API 更加安全,不存在代码进入内核态的问题,也不存在函数堆栈溢出的问题。所以说android系统比传统的操作系统更加安全是有道理的。
下面是一个通用的linux的socket IPC的例子,这个例子的详细解释可以参照这里的描述:http://blog.csdn.net/xnwyd/article/details/7359506
这个例子的好处呢,就是通用,在所有的linux系统下均可以编译使用。经测试,在x86和arm下都可以正常使用。
这个例子我编译的时候使用了arm c语言的交叉编译环境,至于如何搭建arm交叉编译环境,可以参照这里的方法:http://tweetyf.org/2013/04/using_the_android_toolchain_as_a_standalone_compiler.html
另外,如果你有android的源代码编译环境,且需要把自己编译的本地服务集成到系统中的话,有更加简洁的方法创建和编译系统服务,这个下回再做介绍。
server.c 编译方法:arm-linux-androideabi-gcc -o server server.c
01#include<sys/types.h>
02#include<sys/socket.h>
03#include<stdio.h>
04#include<sys/un.h>
05#include<unistd.h>
06#include<stdlib.h>
07#include <stddef.h>
08
09#define SERVER_NAME "@server_socket"
10/*
11 * Create a UNIX-domain socket address in the Linux "abstract namespace".
12 *
13 * The socket code doesn't require null termination on the filename, but
14 * we do it anyway so string functions work.
15 */
16int makeAddr(const char* name, struct sockaddr_un* pAddr, socklen_t* pSockLen)
17{
18 int nameLen = strlen(name);
19 if (nameLen >= (int) sizeof(pAddr->sun_path) -1) /* too long? */
20 return -1;
21 pAddr->sun_path[0] = '\0'; /* abstract namespace */
22 strcpy(pAddr->sun_path+1, name);
23 pAddr->sun_family = AF_UNIX;
24 *pSockLen = 1 + nameLen + offsetof(struct sockaddr_un, sun_path);
25 return 0;
26}
27
28int main()
29
30{
31 int server_sockfd, client_sockfd;
32 socklen_t server_len, client_len;
33 struct sockaddr_un server_addr;
34 struct sockaddr_un client_addr;
35 char ch;
36 int nread;
37
38 //delete the old server socket
39 //unlink("server_socket");
40 //create socket
41 server_sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
42
43 //name the socket
44 server_addr.sun_family = AF_UNIX;
45 strcpy(server_addr.sun_path, SERVER_NAME);
46 server_addr.sun_path[0]=0;
47 //server_len = sizeof(server_addr);
48 server_len = strlen(SERVER_NAME) + offsetof(struct sockaddr_un, sun_path);
49 //makeAddr("server_socket", &server_addr, &server_len);
50 bind(server_sockfd, (struct sockaddr *)&server_addr, server_len);
51
52 //listen the server
53 listen(server_sockfd, 5);
54 client_sockfd = -1;
55 client_len = sizeof(client_addr);
56 while(1){
57 printf("server waiting...\n");
58 //accept client connect
59 if(client_sockfd == -1){
60 client_sockfd = accept(server_sockfd,(struct sockaddr*)&client_addr, &client_len);
61 }
62
63 //read data from client socket
64 nread = read(client_sockfd, &ch, 1);
65 if(nread == 0){//client disconnected
66 printf("client %d disconnected\n",client_sockfd);
67 client_sockfd = -1;
68 }
69 else{
70 printf("read from client %d: %c\n",client_sockfd,ch);
71 ch ++;
72 write(client_sockfd, &ch, 1);
73 }
74 usleep(100);//1000 miliseconds = 1 second
75 }
76
77 return 0;
78
79}
client.c 编译:arm-linux-androideabi-gcc -o client client.c
01#include<sys/types.h>
02#include<sys/socket.h>
03#include<stdio.h>
04#include<sys/un.h>
05#include<unistd.h>
06#include<stdlib.h>
07#include <stddef.h>
08#define SERVER_NAME "@server_socket"
09/*
10 * Create a UNIX-domain socket address in the Linux "abstract namespace".
11 *
12 * The socket code doesn't require null termination on the filename, but
13 * we do it anyway so string functions work.
14 */
15int makeAddr(const char* name, struct sockaddr_un* pAddr, socklen_t* pSockLen)
16{
17 int nameLen = strlen(name);
18 if (nameLen >= (int) sizeof(pAddr->sun_path) -1) /* too long? */
19 return -1;
20 pAddr->sun_path[0] = '\0'; /* abstract namespace */
21 strcpy(pAddr->sun_path+1, name);
22 pAddr->sun_family = AF_UNIX;
23 *pSockLen = 1 + nameLen + offsetof(struct sockaddr_un, sun_path);
24 return 0;
25}
26
27int main()
28{
29 int sockfd;
30 socklen_t len;
31 struct sockaddr_un address;
32 int result;
33 char ch = 'A';
34
35 //create socket
36 sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
37 //name the server socket
38 //makeAddr("server_socket", &address, &len);
39 address.sun_family = AF_UNIX;
40 strcpy(address.sun_path, SERVER_NAME);
41 address.sun_path[0]=0;
42 //len = sizeof(address);
43 len = strlen(SERVER_NAME) + offsetof(struct sockaddr_un, sun_path);
44 //connect to server
45 result = connect(sockfd, (struct sockaddr*)&address, len);
46 if(result == -1)
47 {
48 perror("opps:client1");
49 exit(1);
50 }
51 //communicate with server socket
52 while(1)
53 {
54 printf("set send content:");
55 scanf("%c",&ch);
56 write(sockfd, &ch, 1);
57 printf("send to server:%c \n",ch);
58 read(sockfd, &ch, 1);
59 printf("read from server: %c\n", ch);
60
61 }
62 exit(0);
63
64}
分别把client 和 server 上传到arm的板子或者 android手机上,用命令行执行就可以测试效果了。
本文地址:http://tweetyf.org/2013/06/use_socket_ipc_arm.html
ARM环境中的c语言socket进程通信-转相关推荐
- 计算机多媒体技术英语怎么说,计算机多媒体技术环境中的英语语言测试
计算机多媒体技术环境中的英语语言测试 摘 要:教学的重要环节语言测试,借助多媒体的发展而完善其语言测试的功能.本文阐述了计算机多媒体技术在当前及未来的语言测试中的不可估量的运用价值. 关键词:多媒体; ...
- 编译c语言源程序得到的目标文件可以直接在dos环境中运行,c语言练习题一.doc
c语言练习题一 c语言练习题一 1. 一个C程序由若干个C函数组成,各个函数在文件中的位置顺序为: A. 任意 B. 第一个函数必须是主函数,其他函数任意 C. 必须完全按照执行的顺序排列 D. 其他 ...
- 在linux中运行c语言程序,linux环境中运行C语言程序
在linux环境下做运行C语言程序 [root@localhost ~]# cat a.c #include main() {int grade; char chgrade; printf(" ...
- 浅谈java中的ServerSocket和Socket的通信原理实现聊天及多人聊天
聊天,QQ,微信,陌陌很多的即时通讯的软件,不管是桌面端还是移动端,在当今社交的时代都是不可或缺的一部分.这时候说Socket和ServerSocket感觉有点老调重弹感觉,相信很多人早就知道如何使用 ...
- c语言socket全双工通信,使用WebSocket进行全双工通信
一.WebSocket简介 WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议. WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端 ...
- TCP与UDP协议初步学习——网络环境中分布式进程通信的基本概念
TCP与UDP协议初步学习--网络环境中分布式进程通信的基本概念 一.单机系统中进程通信方法 进程和进程通信是操作系统中最基本的概念,首先通过回忆操作系统课程中,关于单击系统中进程和进程通信的问题描述 ...
- SIP语音环境中十大经典问题及解决办法
在VOIP的环境中,特别是基于SIP通信的环境中,我们经常会遇到一些非常常见的问题,例如,单通,30秒就断线,注册问题,回声等.这些问题事实上都有非常直接的排查方式和解决办法,用户可以按照一定的排查方 ...
- linux 进程通信机制,LINUX内核进程高效通信机制研究
摘要:进程间的通信是多任务.多用户操作系统必须考虑的重大问题,Linux继承了Unix的基本设计思想,其安全性和稳定性得到了人们的认可,但随着其应用领域的不断拓展,其通信机制已经不能满足用户的需求.本 ...
- 【Binder】Android 跨进程通信原理解析
前言 在Android开发的过程中,用到跨进程通信的地方非常非常多,我们所使用的Activity.Service等组件都需要和AMS进行跨进程通信,而这种跨进程的通信都是由Binder完成的. 甚至一 ...
最新文章
- win10搭建python环境_win10系统搭建python环境的还原方法
- 用应用封装来提高移动安全,这合适吗?
- 当谈论设备指纹时,我们到底在说什么?(转)
- CTF---Web入门第十二题 程序逻辑问题
- [数据分析][评价方法]打分式评价-信息熵理论与熵权法
- C++ struct结构体 实现搜索二叉树(BST)
- php 文字水印如何居中,php文字水印和php图片水印实现代码(二种加水印方法)
- 如何在python中安装matplotlib模块_Windows下为Python安装Matplotlib模块
- bootstrapV4.6.0 - 导航栏开发 (案例篇)
- arm64 指令集_透彻解析LED驱动芯片HT1632C指令集与驱动编程
- Java String类型数据的字节长度
- additemdecoration重复_安卓中另一个强大的大量数量集控件RecyclerView
- 应对计算机领域中后门,网络课程论坛中长尾现象的应对策略——以《计算机应用基础》网络课程为例...
- Python开源项目大集合:15个领域,181个项目 | 硬核干货
- 关于conda-新手必读
- 【CCCC】L3-015 球队“食物链” (30分),搜索排列
- igbt原理动画演示视频_IGBT的结构与工作原理 测量方法详细讲解
- C# Bitmap引用System.Drawing报错 “...不存在类型命名空间名...”的修复
- Excel只保留2位小数,删掉其他小数位
- CPU 是怎样工作的