参考文章: [1]Unix Domain Socket– IPC通信机制 [2]How fast are Unix domain sockets? [3]read()函数参数理解
一、Unix域的Socket通信及其优点基于socket的框架上发展出一种IPC机制,就是UNIX Domain Socket。虽然网络socket也可用于同一台主机的进程间通讯(通过loopback地址127.0.0.1),但是UNIX Domain Socket用于IPC 更有效率及可靠 :
- 不需要经过网络协议栈
- 不需要打包拆包、计算校验和、维护序号和应答等,可靠性更强
- UNIX Domain Socket传输效率比通过loopback地址快将近一倍
- socket通信基本概念
- LINUX文件操作函数
对于知识一,已经在前面介绍过了。Linux文件操作函数用到了两个:read()和write()。简单介绍一下:
read - 从文件描述符里读取数据
#include
ssize_t read(int fd, void *buf, size_t count);
fd:文件描述符,对于本文而言是socket套接字 buf:缓冲区指针 count:预期读取的字节数 返回值:表示实际读到的字节数(字符串结束符 '\0’不算)
write - 从文件描述符里写入数据
#include
ssize_t read(int fd, void *buf, size_t count);
fd:文件描述符,对于本文而言是socket套接字 buf:缓冲区指针 count:预期写入的字节数 返回值:表示实际写入的字节数(字符串结束符 '\0’不算)
三、程序的功能及其实现程序的功能是实现客户端发送一个整型数据,服务端返回一个倒序的整型数据。
需要解决的问题:
- 创建服务端和客户端
- 数据处理
数据处理部分函数实现:
int num_reverse(int num)
{
int S=0,sum=0;
while(num)
{
S=num%10;
sum=10*sum+S;
num = num / 10;
}
return sum;
}
服务端函数:
#include
#include
#include
#include
#include
#include
#include //define the sockaddr_un structure
int num_reverse(int num);
int main()
{
/* 断开之前的socket文件 */
unlink("server_socket");
/* 创建一个socket */
int server_sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
struct sockaddr_un server_addr;
server_addr.sun_family = AF_UNIX;
strcpy(server_addr.sun_path, "server_socket");
/* 与本地文件进行绑定 */
bind(server_sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr));
/* 监听 */
if(listen(server_sockfd, 5)
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?