Domain Socket

目录

一、基本介绍

二、C Demo

1、Stream Domain Socket

1.1 Client

1.2 Server

2、Datagram  Domain Socket

2.1 Client

2.2 Server

三、Java 应用


一、基本介绍

        Unix域套接字(Unix Domain Socket)是基于 socket  框架上发展出的一种 IPC 机制。它与网络套接字(TCP 或 UDP)不同。网络套接字可以在不同机器上的进程之间进行通信,Domain socket 只可用于 unix 或 linux 系统内部。

        Domain Socket 使用文件系统路径作为地址来标识通信的端点。通信双方可以通过在文件系统中创建一个特殊类型的文件来创建一个 Domain Socket。这个文件可以是一个普通文件,也可以是一个符号链接。两个进程可以通过打开这个文件并使用标准的 socket 读写操作来进行通信。

        Domain Socket 提供了一种可靠的、高性能的进程间通信方式。它避免了网络套接字中的一些开销(网络协议栈打包、拆包、校验和计算、排序等等),并且可以利用操作系统的内核缓冲区来实现高效的数据传输。因此,在同一台机器上的进程间进行通信时,Unix域套接字通常比网络套接字更快。

        IPC 将应用层数据从一个进程拷贝到另一个进程。IPC 机制本质上是可靠的通讯,而网络传输是不可靠,只能通过传输层或应用层来保证可靠性传输。UNIX Domain Socket 也提供面向流和面向数据包两种 API 接口,类似于 TCP 和 UDP,面向消息的 UNIX Domain Socket 也是可靠的,消息既不会丢失也不会顺序错乱。

二、C Demo

        与使用网络地址的 socket 不同,domain socket 绑定本机文件地址,而且 socket family 为 AF_UNIX(或AF_LOCAL),这区别于 AF_INET。

// domain file address
struct sockaddr_un {sa_family_t sun_family; /* AF_UNIX */char sun_path[UNIX_PATH_MAX];   /* pathname */
};/*family(域) : AF_UNIX type : SOCK_STREAM/ SOCK_DGRAM : protocol : 0*/int socket(int domain, int type, int protocol)

1、Stream Domain Socket

1.1 Client

        发送一次消息与接收应答

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/stat.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<sys/un.h>
#include<errno.h>
#include<stddef.h>
#include<unistd.h>
#define BUFFER_SIZE 1024
const char *filename="/tmp/ip.ipc";int main()
{struct sockaddr_un uds_file;char buffer[BUFFER_SIZE] = "hello world";uds_file.sun_family = AF_UNIX;strcpy(uds_file.sun_path,filename);int sock_fd = socket(AF_UNIX,SOCK_STREAM,0);if(sock_fd < 0){printf("Request socket failed\n");return -1;}if(connect(sock_fd,(struct sockaddr *)&uds_file,sizeof(uds_file)) < 0){printf("connect socket failed(%s)\n", strerror(errno));return -1;}send(sock_fd, buffer, BUFFER_SIZE, 0);// -------------int ret = recv(sock_fd, buffer, BUFFER_SIZE, 0);if(ret < 0){printf("recv failed\n");}printf("client receive %s\n", buffer);close(sock_fd);return 0;
}

1.2 Server

        接收客户端消息与应答,且每个客户端只服务一次。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/stat.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<sys/un.h>
#include<errno.h>
#include<stddef.h>
#include<unistd.h>
#include <error.h>#define MAX_CONNECT_NUM 2
#define BUFFER_SIZE 1024
const char filename[50] = "/tmp/ip.ipc";int main()
{int fd = socket(AF_UNIX,SOCK_STREAM,0);if(fd < 0){printf("Request socket failed!\n");return -1;}// domain addressstruct sockaddr_un uds_file;uds_file.sun_family = AF_UNIX;// 防止该文件被其它进程使用unlink(filename);strcpy(uds_file.sun_path, filename);if(bind(fd, (struct sockaddr *)&uds_file, sizeof(uds_file)) < 0 ){printf("bind failed(%s)\n", strerror(errno));return -1;}if(listen(fd, MAX_CONNECT_NUM) < 0){printf("listen failed!\n");return -1;}char buffer[BUFFER_SIZE];while(1){bzero(buffer, BUFFER_SIZE);// 提取就绪socket连接,只服务一次就关闭(测试使用,实际开发中可以启动线程服务每个就绪的socket连接)int new_fd = accept(fd, NULL, NULL);if(new_fd < 0){printf("accept failed\n");return -1;}int ret = recv(new_fd, buffer, BUFFER_SIZE, 0);if(ret < 0){printf("recv failed\n");}strcpy(buffer, "nice to meet you!");send(new_fd, buffer, BUFFER_SIZE, 0);printf("%s\n", buffer);close(new_fd);//break;}close(fd);
}

2、Datagram  Domain Socket

        Datagram Domain socket 适合单向传输,双向需要另外定义一个 socket。

2.1 Client

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/stat.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<sys/un.h>
#include<errno.h>
#include<stddef.h>
#include<unistd.h>#define SIZE 4096
#define COUNT 1000000const char filename[50] = "/tmp/ip.ipc";int main(int argc, char **argv)
{struct sockaddr_un ipc_file;memset(&ipc_file, 0, sizeof(struct sockaddr));ipc_file.sun_family = AF_UNIX;strcpy(ipc_file.sun_path, filename);// unix domain socketint uds = socket(AF_UNIX, SOCK_DGRAM, 0);if (uds < 0){printf("unix domain socket created failed\n");return -1;}printf("[client] : domain file name (%s)\n", filename);unsigned char buff[SIZE] = "Hello World";int res = sendto(uds, buff, SIZE, 0, (struct sockaddr *)&ipc_file, sizeof(struct sockaddr_un));if (res < 0){printf("send failed\n");}printf("over\n");return 0;
}

2.2 Server

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/stat.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<sys/un.h>
#include<errno.h>
#include<stddef.h>
#include<unistd.h>#define SIZE 4097
#define COUNT 1000000
const char filename[50] = "/tmp/ip.ipc";int main()
{// domain filestruct sockaddr_un ipc_file;memset(&ipc_file, 0, sizeof(ipc_file));ipc_file.sun_family = AF_UNIX;unlink(filename);strcpy(ipc_file.sun_path, filename);// unix domain socketint uds = socket(AF_UNIX, SOCK_DGRAM, 0);if (uds < 0){printf("unix domain socket created failed\n");return -1;}// uds bind domain fileif (bind(uds, (struct sockaddr *)&ipc_file, sizeof(ipc_file)) < 0){printf("bind failed\n");return -1;}printf("[server] : domain file name (%s)\n", filename);// buffchar buff[SIZE] = "";while ( 1 ){int size = recvfrom(uds, buff, SIZE, 0, NULL, NULL);if ( size < 0 ){printf("recv failed\n");break;}printf("recv--(%s)\n", buff);}printf("over\n");close(uds);}

三、Java 应用

        Java 自 1.7 开始支持。下面例子从网上找的,不一定可以运行,仅作参考。

1、Server

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;public class Server {public static void main(String[] args) {try {// 创建服务端Socket,并指定监听的端口ServerSocket serverSocket = new ServerSocket(8888);System.out.println("Server started, waiting for client connection...");// 接受客户端连接Socket clientSocket = serverSocket.accept();System.out.println("Client connected.");// 处理客户端请求// ...// 关闭连接clientSocket.close();serverSocket.close();} catch (IOException e) {e.printStackTrace();}}
}

2、Client

import java.io.IOException;
import java.net.Socket;public class Client {public static void main(String[] args) {try {// 创建客户端Socket,并指定服务器的地址和端口Socket socket = new Socket("localhost", 8888);// 发送数据到服务端// ...// 读取服务端的响应// ...// 关闭连接socket.close();} catch (IOException e) {e.printStackTrace();}}
}

        对于开发环境是 1.6 的,所以需要封装 C 动态库,java 层通过 JNI 进行调用。

public class DomainSocket {// stream domain socketpublic native int domain_socket();public native int bind(int fd, String sock_file);public native int listen(int fd, int max_num);public native int accept(int fd);public native int connect(int fd, String sock_file);public native int send(int fd, byte[] buffer, int len);public native int recv(int fd, byte[] buffer, int len);public native int close(int fd);public native String last_error();
}

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

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

相关文章

初步认识并发编程的艺术

一、Java内存模型 JMM&#xff08;Java Memory Model&#xff09;&#xff1a;Java 内存模型&#xff0c;是 Java 虚拟机规范中所定义的一种内存模型&#xff0c;Java 内存模型是标准化的&#xff0c;屏蔽掉了底层不同计算机的区别。也就是说&#xff0c;JMM 是 JVM 中定义的一…

Vue2 props组件通信

一、父组件向子组件传值 1、流程图 2、父组件代码 <template><div class"app"><UserInfo:usernameusername:ageage:isSingleisSingle:carcar:hobbyhobby></UserInfo></div> </template><script> import UserInfo from .…

查询排序(1)

Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 前面介绍了在 SQL 限定查询中 WHERE 子句的运行顺序优先于 SELECT 子句&#xff0c;WHERE 子句确定数据行&#xff0c;SELECT 子句确定数据列。 也分别讲述了在 WHERE 子句中常用的运算…

深度学习模型选择

作为机器学习科学家&#xff0c;我们的目标是发现模式&#xff08;pattern&#xff09;。 但是&#xff0c;我们如何才能确定模型是真正发现了一种泛化的模式&#xff0c; 而不是简单地记住了数据呢&#xff1f;接下来介绍几种模型选择时候需要注意的点 误差 训练误差 训练误…

Android修行手册 - 一套源码发布多个apk(多包名,多名称,多Logo)

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC

Beego之Beego MVC架构介绍

1、beego MVC架构介绍 beego 是一个典型的 MVC 框架&#xff0c;它的整个执行逻辑如下图所示&#xff1a; 通过文字来描述如下&#xff1a; 1、在监听的端口接收数据&#xff0c;默认监听在 8080 端口。 2、用户请求到达 8080 端口之后进入 beego 的处理逻辑。 3、初始化 C…

java_编译器和解释器_类加载器

java_编译器和解释器_类加载器 编译器解释器类加载器 编译器 a.java 变成 a.class 就是编译器干的事&#xff0c;也就是你执行 javac a.java产出a.class的过程。 javac 就是 java compiler。 .java文件 package test;public class Test {public static void main(String[] a…

openssl3.2/test/certs - 056 - all DNS-like CNs allowed by CA1, no SANs

文章目录 openssl3.2/test/certs - 056 - all DNS-like CNs allowed by CA1, no SANs概述笔记END openssl3.2/test/certs - 056 - all DNS-like CNs allowed by CA1, no SANs 概述 openssl3.2 - 官方demo学习 - test - certs 笔记 /*! * \file D:\my_dev\my_local_git_prj\…

智能风控体系之层次分析法专家评分卡

层次分析法 (Analytic Hierarchy Process&#xff0c;简称 AHP) 由美国运筹学家托马斯 塞蒂 (T. L. Saaty) 于上世纪70年代中期提出&#xff0c;是通过定量与定性分析相结合的方法来进行多方案或多目标决策分析的一种方法。该方法的主要思想是通过将一个复杂的问题分解为若干层…

Jackson序列化Bean额外属性附加--@JsonAnyGetter、@JsonUnwrapped用户

1. 场景 有一项工作&#xff0c;需要将数据从一个服务S中读取出来&#xff08;得到的是一个JSON&#xff09;&#xff0c;将数据解析转换以后构造成一个数组的类型A的对象&#xff0c;写入到一个服务T中。 A.class Data public class A {String f0 ;String f1 ; }在发现需要…

【数据库学习】pg安装与运维

1&#xff0c;安装与配置 #安装 yum install https:....rpm1&#xff09;安装目录 bin目录&#xff1a;二进制可执行文件目录&#xff0c;此目录下有postgres、psql等可执行程序&#xff1b;pg_ctl工具在此目录&#xff0c;可以通过pg_ctl --help查看具体使用。 conf目录&…

LeetCode-题目整理【7】

加油站和分发糖果都使用到贪心算法 加油站 在一条环路上有 n 个加油站&#xff0c;其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车&#xff0c;从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发&#xff0c;开始时油箱…

pyspark学习_RDD转为DataFrame

#方法1&#xff1a;反射机制推断RDD模式 people.txt Tom 12 Jack 13 Janny 14 from pyspark.sql import SparkSession,Row spark SparkSession.builder.getOrCreate() lines spark.sparkContext.textFile("people.txt") people lines.map(lambda x:x.split("…

Nginx日志检测分析工具 - WGCLOUD

WGCLOUD可以对Nginx的日志文件进行全面分析&#xff0c;包括IP、sql注入攻击、搜索引擎蜘蛛爬取记录、HTTP响应状态码、访问量最高的IP统计、扫描攻击统计等 效果如下图

C#winform上位机开发学习笔记13-串口助手显示系统时间功能添加

1.功能描述 在上位机中显示系统的实时时间 2.代码部分 步骤1&#xff1a;添加文本框控件并设置参数 #此处注意将BackColor颜色修改为非Control&#xff0c;即可正常显示ForeColor颜色&#xff0c;否则该颜色不变&#xff0c;原因暂且不明。 步骤2&#xff1a;添加timer控件…

Linux/Doctor

Enumeration nmap 已知目标开放了22,80,8089端口&#xff0c;扫描详细情况如下 可以看到对外开放了22,80,8089三个端口 TCP/80 SSTI 访问80端口&#xff0c;有一个infodoctors.htb的电子邮件&#xff0c;点击其他的也没有什么反应&#xff0c;猜测有可能需要域名访问 在/et…

[每日一题] 01.25 - 子数整数

子数整数 k int(input()) flag False for i in range(10000,30001):a,b,c [int(str(i)[j:j 3]) for j in range(3)]if a % k 0 and b % k 0 and c % k 0:print(i)flag Trueif not flag:print(No)

美易平台:美股盘前动态:半导体股领涨,中概股表现各异

随着全球经济的波动和科技行业的快速发展&#xff0c;投资者对于股市的关注日益增加。近期&#xff0c;美国股市在盘前交易中呈现出了半导体股的普遍上涨态势。其中&#xff0c;英特尔&#xff08;Intel&#xff09;的股价上涨了1.6%&#xff0c;英伟达&#xff08;NVIDIA&…

Python批量采集亚马逊商品数据

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 知识点: 爬虫基本流程 非结构化数据解析 开发环境&#xff1a; python 3.8 解释器, 运行代码 pycharm 随便 配置 python解释器 DrissionPage >>> p…

前出深入-机器学习

文章目录 一、K近邻算法1.1 先画一个散列图1.2 使用K最近算法建模拟合数据1.3 进行预测1.4 K最近邻算法处理多元分类问题1.5 K最近邻算法用于回归分析1.6 K最近邻算法项目实战-酒的分类1.6.1 对数据进行分析1.6.2 生成训练数据集和测试数据集1.6.3 使用K最近邻算法对数据进行建…