android unix socket,Unix Socket

概述

socket通信是大家耳熟能详的一种进程间通信方式(IPC),它是一种全双工的通信方式,不同于pipe这种单工方式.这篇文章将深入浅出的讲解一下什么是socket。

我们常说的socket通信有以下二种,主要会说一下Unix domain socket

Internet domain socket

该socket可以用于不同主机间的通信,就像聊QQ一样只要知道了对方的QQ号就可以聊天了。socket只要知道了对方的ip地址和端口就可以通信了所以这种socket通信是基于网络协议栈的。

Unix domain socket

该socket用于一台主机的进程间通信,不需要基于网络协议,主要是基于文件系统的。与Internet domain socket类似,需要知道是基于哪一个文件(相同的文件路径)来通信的

unix domain socket有2种工作模式一种是SOCK_STREAM,类似于TCP,可靠的字节流。另一种是SOCK_DGRAM,类似于UDP,不可靠的字节流。

工作模型

socket通信有一个服务端,一个客服端

服务端:创建socket—绑定文件(端口)—监听—接受客户端连接—接收/发送数据—…—关闭

客户端:创建socket—绑定文件(端口)—连接—发送/接收数据—…—关闭

代码框架

server

sockaddr_un :为一个系统级的结构体,主要用于存储地址

#define NAME "socketAddr"

main(){

...

struct sockaddr_un server;

...

int sock = socket(AF_UNIX, SOCK_STREAM, 0);

strcpy (server.sun_path, NAME);

...

bind(sock, (structsockaddr *) &server, sizeof(struct sockaddr_un));

...

listen(sock, 5);

...

while(1){

...

msgsock = accept(sock, 0, 0);

...

rval = read(msgsock, buf, 1024))

...

}

}复制代码

client

#define NAME "socketAddr"

main(){

...

sock = socket(AF_UNIX, SOCK_STREAM, 0);

strcpy(server.sun_path, NAME);

...

if (connect(sock, (struct sockaddr *) &server, sizeof(struct sockaddr_un)) < 0) {

close(sock);

exit(1);

}

if (write(sock, DATA, sizeof(DATA)) < 0)

perror("writing on stream socket");

close(sock);

}复制代码

demo下载

gcc service.c -o service

gcc client.c -o client

linux下启动一个窗口运行 ./service

启动另一个窗口运行 ./client socket 【这个socket为service中绑定的地址】

运行后可以发现,在当前目录下会多一个名叫socket的文件,这2个进程就是基于该文件通信的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值