当前位置: 首页 > news >正文

网络编程(域套接字)

一、域套接字的概念

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.只能做一台主机内的进程间通信&#xff0c;协议族&#xff08;地址族&#xff09;指定为&#xff1a;AF_UNIX AF_LOCAL 2.bsp-lcd&#xff1a; s类型文件&#xff0c;就是域套接字 3.如果客户端不手动绑定&#xff0c;则操作系统不会创建一个套接字文件…...

探索短视频小程序/小年糕

短视频小程序的兴起&#xff0c;为创作者提供了一个全新的平台&#xff0c;让他们能够以更专业的方式展现自己的作品。这种创作形式不仅要求作品内容足够精彩还需要有深度的思考和逻辑性的呈现。本文将探索短视频小程序的专业与深度的创作之道&#xff0c;帮助创作者更好地发挥…...

基于MATLAB开发AUTOSAR软件应用层Code mapping专题-part 7 Function callers标签页介绍

不知不觉这个code-mapping专题已经写了6篇文章了,今天是我们这个专题的最后一篇文章了介绍Function callers 这个其实很简单,以前的文章里也有提到CS接口实现两个SWC之间的CS调用,我们在从Code-mapping的角度在说下 首先还是看下模型 我们还记得在simulink里我们用function…...

ARM开发(cortex-A7核中断实验)

1.实验目的&#xff1a;实现KEY1/LEY2/KE3三个按键&#xff0c;中断触发打印一句话&#xff0c;并且灯的状态取反&#xff1b; key1 ----> LED3灯状态取反&#xff1b; key2 ----> LED2灯状态取反&#xff1b; key3 ----> LED1灯状态取反&#xff1b; 2.分析框图: …...

关于融合项目点云pointpillars检测不显示三维检测框问题的解决

这个问题主要还是launch文件中出现了一些偏差。 launch文件的第26行 这里原先是0.6&#xff0c;在检测kitti的时候是0.6&#xff0c;由于kitti是64线激光雷达&#xff0c;我个人用的是16线激光雷达&#xff0c;所以把0.6降到了0.2.出现了三维检测框&#xff0c;问题解决...

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列表&#xff0c;用于初始化建立和Kafka集群的连接。列表格式为host1:port1,host2:port2,…&#xff0c;无需添加所有的集群地址&#xff0c;kafka会根据提供的地址发现其他的地址&…...

PMP P-01 Basic Knowledge

PMP基础知识...

java八股文面试[数据结构]——ArrayList和LinkedList区别

ArrayList和LinkedList的异同 二者的线程都不安全&#xff0c;相对线程安全的Vector,执行效率高。此外&#xff0c;ArrayList时实现了基于动态数组的数据结构&#xff0c;LinkedList基于链表的数据结构&#xff0c;对于随机访问get和set&#xff0c;ArrayList觉得优于LinkedLis…...

OpenCV中QR二维码的生成与识别(CIS摄像头解析)

1、QR概述 QR(Quick Response)属于二维条码的一种&#xff0c;意思是快速响应的意思。QR码不仅信息容量大、可靠性高、成本低&#xff0c;还可表示汉字及图像等多种文字信息、其保密防伪性强而且使用非常方便。更重要的是QR码这项技术是开源的&#xff0c;在移动支付、电影票、…...

常见排序集锦-C语言实现数据结构

目录 排序的概念 常见排序集锦 1.直接插入排序 2.希尔排序 3.选择排序 4.堆排序 5.冒泡排序 6.快速排序 hoare 挖坑法 前后指针法 非递归 7.归并排序 非递归 排序实现接口 算法复杂度与稳定性分析 排序的概念 排序 &#xff1a;所谓排序&#xff0c;就是使一串记录&#…...

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…...

机器学习深度学习——自注意力和位置编码(数学推导+代码实现)

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——注意力分数&#xff08;详细数学推导代码实现&#xff09; &#x1f4da;订阅专栏&#xff1a;机器学习…...

02.案列项目Demo

1.创建项目 1. 创建项目 用pycharm 选择对应的编译器&#xff0c;输入对应的文件名&#xff0c;点击创建项目。删除默认外层生成的template和DIRS 配置项&#xff1a; 2. 创建App 创建appo1的命令&#xff1a; python manage.py startapp app01 如果使用pycharm>tool>…...

PDF校对:追求文档的精准与完美

随着数字化时代的到来&#xff0c;PDF已经成为了多数机构和个人首选的文件格式&#xff0c;原因在于它的稳定性、跨平台特性以及统一的显示效果。但是&#xff0c;对于任何需要公开或正式发布的文档&#xff0c;确保其内容的准确性是至关重要的&#xff0c;这就是PDF校对显得尤…...

低代码解放生产力,助力企业高效发展

近年来&#xff0c;随着数字化转型的推进&#xff0c;企业对于软件开发的需求日益显著。然而&#xff0c;传统的软件开发模式通常需要耗费大量时间和资源&#xff0c;限制了企业的快速响应能力。为了解决这一难题&#xff0c;低代码开发平台应运而生&#xff0c;成为企业和开发…...

【前端从0开始】CSS——9、浮动

1. 浮动&#xff08;float&#xff09; 1.1 定义 float 属性定义元素向哪个方向浮动。之前这个属性应用于图像&#xff0c;使文本围绕在图像周围&#xff0c;不过在 CSS 中&#xff0c;任何元素都可以浮动。浮动元素会生成一个块级框&#xff0c;不论它本身是何种元素。 取值…...

如何在Moonriver网络上向社区代表委托投票权利

我们之前介绍了「社区代表」这一概念&#xff0c;想必大家对社区代表在治理中扮演的角色和地位有了一定的了解。 本文将介绍如何将您的投票权利委托给社区代表。请注意&#xff0c;在委托Token给社区代表这一过程中&#xff0c;并非将您的Token转移给任何人&#xff0c;而且此…...

时序预测 | MATLAB实现基于CNN-GRU卷积门控循环单元的时间序列预测-递归预测未来(多指标评价)

时序预测 | MATLAB实现基于CNN-GRU卷积门控循环单元的时间序列预测-递归预测未来(多指标评价) 目录 时序预测 | MATLAB实现基于CNN-GRU卷积门控循环单元的时间序列预测-递归预测未来(多指标评价)预测结果基本介绍程序设计参考资料 预测结果 基本介绍 MATLAB实现基于CNN-GRU卷积…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...

面试高频问题

文章目录 &#x1f680; 消息队列核心技术揭秘&#xff1a;从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"&#xff1f;性能背后的秘密1.1 顺序写入与零拷贝&#xff1a;性能的双引擎1.2 分区并行&#xff1a;数据的"八车道高速公路"1.3 页缓存与批量处理…...

向量几何的二元性:叉乘模长与内积投影的深层联系

在数学与物理的空间世界中&#xff0c;向量运算构成了理解几何结构的基石。叉乘&#xff08;外积&#xff09;与点积&#xff08;内积&#xff09;作为向量代数的两大支柱&#xff0c;表面上呈现出截然不同的几何意义与代数形式&#xff0c;却在深层次上揭示了向量间相互作用的…...

EEG-fNIRS联合成像在跨频率耦合研究中的创新应用

摘要 神经影像技术对医学科学产生了深远的影响&#xff0c;推动了许多神经系统疾病研究的进展并改善了其诊断方法。在此背景下&#xff0c;基于神经血管耦合现象的多模态神经影像方法&#xff0c;通过融合各自优势来提供有关大脑皮层神经活动的互补信息。在这里&#xff0c;本研…...

【AI News | 20250609】每日AI进展

AI Repos 1、OpenHands-Versa OpenHands-Versa 是一个通用型 AI 智能体&#xff0c;通过结合代码编辑与执行、网络搜索、多模态网络浏览和文件访问等通用工具&#xff0c;在软件工程、网络导航和工作流自动化等多个领域展现出卓越性能。它在 SWE-Bench Multimodal、GAIA 和 Th…...

十二、【ESP32全栈开发指南: IDF开发环境下cJSON使用】

一、JSON简介 JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;具有以下核心特性&#xff1a; 完全独立于编程语言的文本格式易于人阅读和编写易于机器解析和生成基于ECMAScript标准子集 1.1 JSON语法规则 {"name"…...