网络编程(域套接字)
一、域套接字的概念
1.只能做一台主机内的进程间通信,协议族(地址族)指定为:AF_UNIX AF_LOCAL
2.bsp-lcd: s类型文件,就是域套接字
3.如果客户端不手动绑定,则操作系统不会创建一个套接字文件给客户端自动绑定的。
二、域套接字的函数使用
1)socket
功能:在内核空间中创建套接字文件(接收缓冲区,发送缓冲区),并返回该套接字文件的文件描述符到用户空间
原型:
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
参数:
参数:int domain:协议族,地址族;Name Purpose Man pageAF_UNIX, AF_LOCAL Local communication unix(7)int type: 套接字类型 SOCK_STREAM:字节流式套接字,流式套接字---->TCP协议SOCK_DGRAM: 数据报式套接字,报式套接字---->UDP协议SOCK_RAW:原始套接字,该套接字使用的协议需要在第三个参数指定;int protocol:指定协议,默认协议填0;TCP协议: IPPROTO_TCP IPPROTO_UDP
返回值:
>0 , 成功,返回套接字文件描述符;
=-1, 失败,更新errno;
2)bind
功能:将地址信息绑定到套接字文件描述符上
原型:
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
参数:
int sockfd:指定要将地址信息绑定到哪个套接字文件描述符上;
struct sockaddr *addr:通用地址信息结构体,真实的地址信息结构体根据地址族指定.该结构体中需要填充上IP和端口,由bind函数绑定到套接字上。
AF_UNIX : man 7 unix
struct sockaddr_un {sa_family_t sun_family; /* AF_UNIX */ 必须填AF_UNIXchar sun_path[108]; /* pathname */ 套接字文件路径,必须事
先不存在,由bind函数生成!};
socklen_t addrlen:真实的地址信息结构体的长度,sizeof(struct sockaddr_un);
返回值:
成功,返回0;
失败,返回-1,更新errno;
3)access
功能:判断文件是否存在,或者文件是否有某种权限
4)unlink
功能:删除文件(的硬链接)
三、流式域套接字
1)UNIX TCP服务器
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>
#include <string.h>
#include <sys/un.h>#define ERR_MSG(msg) do{\fprintf(stderr, "__%d__ ", __LINE__);\perror(msg);\
}while(0)int main(int argc, const char *argv[])
{//创建流式套接字int sfd = socket(AF_UNIX, SOCK_STREAM, 0);if(sfd < 0){ERR_MSG("socket");return -1;}//判断域套接字文件是否存在if(access("./unix", F_OK) == 0){//若存在则删除unlink("./unix");}//填充服务器的地址信息结构体。AF_UNIX: man 7 unixstruct sockaddr_un sun;sun.sun_family = AF_UNIX; //必须填AF_UNIXstrcpy(sun.sun_path, "./unix"); //套接字文件路径//绑定服务器的IP和端口--->必须绑定if(bind(sfd, (struct sockaddr *)&sun, sizeof(sun)) < 0){ERR_MSG("bind");return -1;}printf("bind success\n");//将套接字设置为被动监听状态,监听是否有客户端连接if(listen(sfd, 128) < 0){ERR_MSG("listen");return -1;}printf("listen success\n");struct sockaddr_un cun; //存储客户端地址信息socklen_t addrlen = sizeof(cun);//阻塞函数,阻塞等待客户端连接成功; 从已完成连接的队列头中获取一个客户端信息,生成一个新的文件描述符;//这个新的文件描述符,才是与客户端通信的文件描述符;int newfd = accept(sfd, (struct sockaddr*)&cun, &addrlen);if(newfd < 0){ERR_MSG("accept");return -1;}printf("[%s] newfd=%d 客户端连接成功\n", cun.sun_path, newfd);char buf[128] = "";ssize_t res = 0;while(1){bzero(buf, sizeof(buf));//接收数据res = recv(newfd, buf, sizeof(buf), 0);if(res < 0){ERR_MSG("recv");return -1;}else if(0 == res){printf("[%s] newfd=%d 客户端下线\n", cun.sun_path, newfd);break;}printf("[%s] newfd=%d : %s\n", cun.sun_path, newfd, buf);//发送数据strcat(buf, "*_*"); //可以修改成从其他地方获取if(send(newfd, buf, sizeof(buf), 0) < 0){ERR_MSG("send");return -1;}printf("发送成功\n");}close(newfd);//关闭文件描述符if(close(sfd) < 0){ERR_MSG("close");return -1;}return 0;
}
2)UNIX TCP 客户端
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>
#include <string.h>
#include <sys/un.h>#define ERR_MSG(msg) do{\fprintf(stderr, "__%d__ ", __LINE__);\perror(msg);\
}while(0)int main(int argc, const char *argv[])
{//创建流式套接字int cfd = socket(AF_UNIX, SOCK_STREAM, 0);if(cfd < 0){ERR_MSG("socket");return -1;}//填充客户端自身的地址信息结构体。AF_UNIX: man 7 unix//绑定客户端的地址信息--->非必须绑定//如果客户端不手动绑定,则操作系统不会创建一个套接字文件给客户端自动绑定的。//填充服务器的地址信息结构体,给connect函数使用。//要连接哪个服务器,就填充哪个服务器绑定的地址信息struct sockaddr_un sun;sun.sun_family = AF_UNIX; //必须填AF_UNIXstrcpy(sun.sun_path, "./unix");//连接服务器if(connect(cfd, (struct sockaddr*)&sun, sizeof(sun)) < 0){ERR_MSG("connect");return -1;}printf("connect success\n");char buf[128] = "";ssize_t res = 0;while(1){bzero(buf, sizeof(buf));//发送数据printf("请输入>>> ");fgets(buf, sizeof(buf), stdin);buf[strlen(buf)-1] = 0;//对方接收多少个字节,发送多少个字节if(send(cfd, buf, sizeof(buf), 0) < 0){ERR_MSG("send");return -1;}printf("发送成功\n");bzero(buf, sizeof(buf));//接收数据 res = recv(cfd, buf, sizeof(buf), 0);if(res < 0){ERR_MSG("recv");return -1;}else if(0 == res){printf("cfd=%d 服务器下线\n", cfd);break;}printf("cfd=%d : %s\n", cfd, buf);}//关闭文件描述符if(close(cfd) < 0){ERR_MSG("close");return -1;}return 0;
}
四、报式域套接字
1.报式域套接字的编程与网络报式套接字编程思路是一致的,但是由于客户端不手动绑定的话,操作系统不会自动创建一个套接字文件给客户端绑定
2.此时若服务器想给客户端回复信息,会找不到客户端的地址信息。此时客户端是必须绑定的。
1)UNIX UDP服务器
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>
#include <string.h>
#include <sys/un.h>#define ERR_MSG(msg) do{\fprintf(stderr, "__%d__ ", __LINE__);\perror(msg);\
}while(0)int main(int argc, const char *argv[])
{//创建报式套接字int sfd = socket(AF_UNIX, SOCK_DGRAM, 0);if(sfd < 0){ERR_MSG("socket");return -1; }printf("sfd = %d\n", sfd);//判断文件是否存在//若存在,则删除if(access("./unixSer", F_OK) == 0){unlink("./unixSer");}//填充服务器的地址信息结构体, AF_UNIX: man 7 unixstruct sockaddr_un sun;sun.sun_family = AF_UNIX;strcpy(sun.sun_path, "./unixSer");//绑定服务器的地址信息if(bind(sfd, (struct sockaddr*)&sun, sizeof(sun)) < 0){ERR_MSG("bind");return -1;}printf("bind success\n");struct sockaddr_un cun; //存储数据包是从谁哪里来的socklen_t addrlen = sizeof(cun);char buf[128] = "";while(1){bzero(buf, sizeof(buf));//接收数据//if(recvfrom(sfd, buf, sizeof(buf), 0, NULL, NULL) < 0)if(recvfrom(sfd, buf, sizeof(buf), 0, (struct sockaddr*)&cun, &addrlen) < 0){ERR_MSG("recvfrom");return -1;}printf("[%s] : %s\n", cun.sun_path, buf);//发送数据 --> 谁发给我,我发给谁strcat(buf, "*_*");if(sendto(sfd, buf, sizeof(buf), 0, (struct sockaddr*)&cun, sizeof(cun)) < 0){ERR_MSG("sendto");return -1;}printf("sendto success\n");}//关闭套接字close(sfd);return 0;
}
2)UNIX UDP客户端
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>
#include <string.h>
#include <sys/un.h>#define ERR_MSG(msg) do{\fprintf(stderr, "__%d__ ", __LINE__);\perror(msg);\
}while(0)int main(int argc, const char *argv[])
{if(argc < 2){printf("请输入套接字文件路径名\n");return -1;}//创建报式套接字int cfd = socket(AF_UNIX, SOCK_DGRAM, 0);if(cfd < 0){ERR_MSG("socket");return -1;}printf("cfd = %d\n", cfd);//绑定客户端的地址信息---》非必须绑定//如果客户端不手动绑定,则操作系统不会创建一个套接字文件给客户端自动绑定的。//若服务器要给当前客户端回复信息,则当前客户端必须要绑定//判断文件是否存在//若存在,则删除if(access(argv[1], F_OK) == 0){unlink(argv[1]);}//填充客户端的地址信息结构体,给bind函数使用 struct sockaddr_un cun;cun.sun_family = AF_UNIX;strcpy(cun.sun_path, argv[1]);if(bind(cfd, (struct sockaddr*)&cun, sizeof(cun)) < 0){ERR_MSG("bind");return -1;}printf("客户端绑定成功\n");//填充服务器的地址信息结构体,给下面的sendto函数使用struct sockaddr_un sun;sun.sun_family = AF_UNIX;strcpy(sun.sun_path, "./unixSer");struct sockaddr_un rcvaddr; //存储数据包是从谁哪里来的socklen_t addrlen = sizeof(rcvaddr);char buf[128] = "";while(1){bzero(buf, sizeof(buf));//发送数据 --> 给服务器printf("请输入>>> ");fgets(buf, sizeof(buf), stdin);buf[strlen(buf)-1] = 0;if(sendto(cfd, buf, sizeof(buf), 0, (struct sockaddr*)&sun, sizeof(sun)) < 0){ERR_MSG("sendto");return -1; }printf("sendto success\n");//接收数据if(recvfrom(cfd, buf, sizeof(buf), 0, (struct sockaddr*)&rcvaddr, &addrlen) < 0){ERR_MSG("recvfrom");return -1;}printf("[%s] : %s\n", rcvaddr.sun_path, buf);}//关闭套接字close(cfd);return 0;
}
相关文章:
网络编程(域套接字)
一、域套接字的概念 1.只能做一台主机内的进程间通信,协议族(地址族)指定为:AF_UNIX AF_LOCAL 2.bsp-lcd: s类型文件,就是域套接字 3.如果客户端不手动绑定,则操作系统不会创建一个套接字文件…...
探索短视频小程序/小年糕
短视频小程序的兴起,为创作者提供了一个全新的平台,让他们能够以更专业的方式展现自己的作品。这种创作形式不仅要求作品内容足够精彩还需要有深度的思考和逻辑性的呈现。本文将探索短视频小程序的专业与深度的创作之道,帮助创作者更好地发挥…...
基于MATLAB开发AUTOSAR软件应用层Code mapping专题-part 7 Function callers标签页介绍
不知不觉这个code-mapping专题已经写了6篇文章了,今天是我们这个专题的最后一篇文章了介绍Function callers 这个其实很简单,以前的文章里也有提到CS接口实现两个SWC之间的CS调用,我们在从Code-mapping的角度在说下 首先还是看下模型 我们还记得在simulink里我们用function…...
ARM开发(cortex-A7核中断实验)
1.实验目的:实现KEY1/LEY2/KE3三个按键,中断触发打印一句话,并且灯的状态取反; key1 ----> LED3灯状态取反; key2 ----> LED2灯状态取反; key3 ----> LED1灯状态取反; 2.分析框图: …...
关于融合项目点云pointpillars检测不显示三维检测框问题的解决
这个问题主要还是launch文件中出现了一些偏差。 launch文件的第26行 这里原先是0.6,在检测kitti的时候是0.6,由于kitti是64线激光雷达,我个人用的是16线激光雷达,所以把0.6降到了0.2.出现了三维检测框,问题解决...
spring复习:(57)PropertyOverrideConfigurer用法及工作原理
一、属性配置文件 dataSource.urljdbc:mysql://xxx.xxx.xxx.xxx/test dataSource.usernameroot dataSource.passwordxxxxxx dataSource.driverClassNamecom.mysql.jdbc.Driver #dataSource.typecom.alibaba.druid.pool.DruidDataSource二、spring配置文件 <?xml version&…...
在axios中获取文件上传进度
1.在axios 全局配置的文件中加入一个postFile 方法在上传文件时调用。 export function postFile(url, params,config) {return new Promise((resolve, reject) > {axios.post(url, params,config).then(res > {resolve(res);}).catch(err > {reject(err);})}) } 2.…...
黑马头条-kafka配置
生产者配置 NAMEDESCRIPTIONTYPEDEFAULTVALID VALUESIMPORTANCEbootstrap.servershost/port列表,用于初始化建立和Kafka集群的连接。列表格式为host1:port1,host2:port2,…,无需添加所有的集群地址,kafka会根据提供的地址发现其他的地址&…...
PMP P-01 Basic Knowledge
PMP基础知识...
java八股文面试[数据结构]——ArrayList和LinkedList区别
ArrayList和LinkedList的异同 二者的线程都不安全,相对线程安全的Vector,执行效率高。此外,ArrayList时实现了基于动态数组的数据结构,LinkedList基于链表的数据结构,对于随机访问get和set,ArrayList觉得优于LinkedLis…...
OpenCV中QR二维码的生成与识别(CIS摄像头解析)
1、QR概述 QR(Quick Response)属于二维条码的一种,意思是快速响应的意思。QR码不仅信息容量大、可靠性高、成本低,还可表示汉字及图像等多种文字信息、其保密防伪性强而且使用非常方便。更重要的是QR码这项技术是开源的,在移动支付、电影票、…...
常见排序集锦-C语言实现数据结构
目录 排序的概念 常见排序集锦 1.直接插入排序 2.希尔排序 3.选择排序 4.堆排序 5.冒泡排序 6.快速排序 hoare 挖坑法 前后指针法 非递归 7.归并排序 非递归 排序实现接口 算法复杂度与稳定性分析 排序的概念 排序 :所谓排序,就是使一串记录&#…...
css 实现四角边框样式
效果如图 此图只实现 左下与右下边角样式 右上与左上同理 /* 容器 */ .card-mini {position: relative; } /* 左下*/ .card-mini::before {content: ;position: absolute;left: 0;bottom: 0;width: 20px;height: 20px;border-bottom: 2px solid #253d64;border-left: 2px so…...
机器学习深度学习——自注意力和位置编码(数学推导+代码实现)
👨🎓作者简介:一位即将上大四,正专攻机器学习的保研er 🌌上期文章:机器学习&&深度学习——注意力分数(详细数学推导代码实现) 📚订阅专栏:机器学习…...
02.案列项目Demo
1.创建项目 1. 创建项目 用pycharm 选择对应的编译器,输入对应的文件名,点击创建项目。删除默认外层生成的template和DIRS 配置项: 2. 创建App 创建appo1的命令: python manage.py startapp app01 如果使用pycharm>tool>…...
PDF校对:追求文档的精准与完美
随着数字化时代的到来,PDF已经成为了多数机构和个人首选的文件格式,原因在于它的稳定性、跨平台特性以及统一的显示效果。但是,对于任何需要公开或正式发布的文档,确保其内容的准确性是至关重要的,这就是PDF校对显得尤…...
低代码解放生产力,助力企业高效发展
近年来,随着数字化转型的推进,企业对于软件开发的需求日益显著。然而,传统的软件开发模式通常需要耗费大量时间和资源,限制了企业的快速响应能力。为了解决这一难题,低代码开发平台应运而生,成为企业和开发…...
【前端从0开始】CSS——9、浮动
1. 浮动(float) 1.1 定义 float 属性定义元素向哪个方向浮动。之前这个属性应用于图像,使文本围绕在图像周围,不过在 CSS 中,任何元素都可以浮动。浮动元素会生成一个块级框,不论它本身是何种元素。 取值…...
如何在Moonriver网络上向社区代表委托投票权利
我们之前介绍了「社区代表」这一概念,想必大家对社区代表在治理中扮演的角色和地位有了一定的了解。 本文将介绍如何将您的投票权利委托给社区代表。请注意,在委托Token给社区代表这一过程中,并非将您的Token转移给任何人,而且此…...
时序预测 | MATLAB实现基于CNN-GRU卷积门控循环单元的时间序列预测-递归预测未来(多指标评价)
时序预测 | MATLAB实现基于CNN-GRU卷积门控循环单元的时间序列预测-递归预测未来(多指标评价) 目录 时序预测 | MATLAB实现基于CNN-GRU卷积门控循环单元的时间序列预测-递归预测未来(多指标评价)预测结果基本介绍程序设计参考资料 预测结果 基本介绍 MATLAB实现基于CNN-GRU卷积…...
【李群李代数】李群控制器(lie-group-controllers)介绍——控制 SO(3) 空间中的系统的比例控制器Demo...
李群控制器SO(3)测试 测试代码是一个用于控制 SO(3) 空间中的系统的比例控制器。它通过计算控制策略来使当前状态逼近期望状态。该控制器使用比例增益 kp 进行参数化,然后进行一系列迭代以更新系统状态,最终检查状态误差是否小于给定的阈值。这个控制器用…...
DP读书:鲲鹏处理器 架构与编程(六)PCI Express 总线
处理器与服务器:PCI Express 总线 PCI Express 总线1. PCI Express 总线的特点a. 高速差分传输b. 串行传输c. 全双工端到端连接d. 基于多通道的数据传输方式e. 基于数据包的传输 2. PCI Express 总线的组成与拓扑结构a. 根复合体b. PCI Express桥c. 功能单元 3. PCI…...
Pyqt5-开源工具分解功能(文本拖拽)
开源第四篇:功能实现之拖拽功能与配置文件。 写这个功能的初衷,是因为,每次调试我都要手动敲命令,太麻烦了,想偷个懒,所以直接给这功能加上了,顺便衍生出了另一个想法,配置文件自动填写相关数据。 先看个简单的拖拽功能: 很明显吧,还是比较便捷的。所以我们本章,就在…...
Java版B/S架构 智慧工地源码,PC、移动、数据可视化智慧大屏端源码
智慧工地是什么?智慧工地主要围绕绿色施工、安全管控、劳务管理、智能管理、集成总控等方面,帮助工地解决运营、管理方面各个难点痛点。在互联网的加持下促进项目现场管理的创新与发展,实现工程管理人员与工程施工现场的整合,构建…...
无涯教程-PHP - Session选项
从PHP7 起, session_start()()函数接受一系列选项,以覆盖在 php.ini 中设置的会话配置指令。这些选项支持 session.lazy_write ,默认情况下此函数为on,如果会话数据已更改,则会导致PHP覆盖任何会话文件。 添加的另一个…...
The Age of Data and AI: Challenges and Opportunities
Simply put Abstract: This paper examines the impact of the “Age of Data” on the field of artificial intelligence (AI). With the proliferation of digital technologies and advancements in data collection, storage, and processing, organizations now have ac…...
WPF 项目中 MVVM模式 的简单例子说明
一、概述 MVVM 是 Model view viewModel 的简写。MVVM模式有助于将应用程序的业务和表示逻辑与用户界面清晰分离。 几个概念的说明: model :数据,界面中需要的数据,最好不要加逻辑代码view : 视图就是用户看到的UI结构 xaml 文件viewModel …...
基于nginx禁用访问ip
一、背景 网络安全防护时,禁用部分访问ip,基于nginx可快速简单实现禁用。 二、操作 1、创建 conf.d文件夹 在nginx conf 目录下创建conf.d文件夹 Nginx 扩展配置文件一般在conf.d mkdir conf.d 2、新建blocksip.conf文件 在conf.d目录新建禁用ip的扩展配置文…...
【第三阶段】kotlin语言的内置函数let
1.使用普通方法对集合的第一个元素相加 fun main() {//使用普通方法对集合的第一个元素相加var list listOf(1,2,3,4,5)var value1list.first()var resultvalue1value1println(result) }执行结果 2.使用let内置函数对集合的第一个元素相加 package Stage3fun main() {//使用…...
【C++入门到精通】C++入门 —— 模版(template)
阅读导航 前言一、模版的概念二、函数模版1. 函数模板概念2. 函数模板定义格式3. 函数模板的原理4. 函数模版的实例化🚩隐式实例化🚩显式实例化 5. 函数模板的匹配原则 三、类模板1. 类模板的定义格式2. 类模板的实例化 四、非类型模板参数1. 概念2. 定义…...
手机网站设计思路/chatgpt网址
Ceph-dash是一款图形化展现Ceph状态的工具,并且部署起来非常简单(在monitor节点上进行部署),操作如下:# mkdir -p /ceph-dash # cd /ceph-dash/ # ls app config.influxdb.json Dockerfile s…...
永久免费企业网站建设/深圳seo招聘
props.load(new FileInputStream("db.properties ")); 是读取当前目录的db.properties 文件 getClass.getResourceAsStream("db.properties "); 是读取当前类所在位置一起的db.properties 文件 getClass.getResourceAsStream("/db.properties ")…...
工地用木模板尺寸/seo科技网
说明: 本文的作者Eric Raymond是Open Source Software领域的领袖,这方面许多 新的思想正是从他那儿产生的,同时他也是UNIX上最流行的Email软件Fetchmail 的作者。 下面这篇文章有点儿长,然而它是值得你去耐心把它读完的。文章以Fe…...
做暖漫画网站/品牌宣传推广文案
1.复杂的迭代计算 假如我们计算的需要100步的计算,但是当我执行到第99步的时候,突然数据消失, 根据血统,从头进行恢复,代价很高 sc.setCheckpointDir("共享存储文件系统的路径") //这些地址存储已经执行过的rdd 2.离线计算和实时计算 storm(实时计算) Flink -> Sc…...
wordpress wrapper/百度一下你就知道官网首页
图像算法中会经常用到摄像机的畸变校正,有必要总结分析OpenCV中畸变校正方法,其中包括普通针孔相机模型和鱼眼相机模型fisheye两种畸变校正方法。 普通相机模型畸变校正函数针对OpenCV中的cv::initUndistortRectifyMap(),鱼眼相机模型畸变校正…...
建设一个自己的网站首页/网络营销推广工具
由于国内Android市场众多渠道,为了统计每个渠道的下载及其它数据统计,就需要我们针对每个渠道单独打包,如果让你打几十个市场的包岂不烦死了,不过有了Gradle,这再也不是事了。 友盟多渠道打包 废话不多说,…...