多点通信与域套接字:2024/3/4
作业1:广播
发送端:
#include <myhead.h>
int main(int argc, const char *argv[])
{//1.创建套接字int sfd=socket(AF_INET,SOCK_DGRAM,0);if(sfd==-1){perror("socket error");return -1;}printf("sfd=%d\n",sfd);//2.设置当前套接字允许广播属性int broadcast=-1;if(setsockopt(sfd,SOL_SOCKET,SO_BROADCAST,&broadcast,sizeof(broadcast))==-1){perror("setsockopt error");return -1;}//3.绑定(非必须)//4.填充地址信息结构体struct sockaddr_in sin;sin.sin_family=AF_INET;sin.sin_port=(8888); //广播端口号sin.sin_addr.s_addr=inet_addr("192.168.199.255"); //广播地址//5.发送数据char sbuf[128]="";while(1){//从终端获取数据printf("请输入>>>");fgets(sbuf,sizeof(sbuf),stdin);sbuf[strlen(sbuf)-1]=0;//发送数据sendto(sfd,sbuf,sizeof(sbuf),0,(struct sockaddr*)&sin,sizeof(sin));printf("发送成功\n");}//6.关闭套接字close(sfd);return 0;
}
接收端:
#include <myhead.h>
int main(int argc, const char *argv[])
{//1.创建套接字int cfd=socket(AF_INET,SOCK_DGRAM,0);if(cfd==-1){perror("socket error");return -1;}printf("cfd=%d\n",cfd);//2.绑定//填充地址信息结构体struct sockaddr_in cin;cin.sin_family=AF_INET;cin.sin_port=(8888); //广播端口号cin.sin_addr.s_addr=inet_addr("192.168.199.255"); //广播地址//绑定if(bind(cfd,(struct sockaddr*)&cin,sizeof(cin))==-1){perror("bind error");return -1;}printf("bind success\n");//3.接收数据char rbuf[128]="";while(1){//清空数据bzero(rbuf,sizeof(rbuf));//读取消息recvfrom(cfd,rbuf,sizeof(rbuf),0,NULL,NULL);printf("收到的消息为:%s\n",rbuf);}//4.关闭套接字close(cfd);return 0;
}
效果图:

作业2:组播
发送端:
#include <myhead.h>
int main(int argc, const char *argv[])
{//1.创建套接字int sfd=socket(AF_INET,SOCK_DGRAM,0);if(sfd==-1){perror("socket error");return -1;}//2.绑定(非必须)//3.发送消息//填充地址信息结构体struct sockaddr_in sin;sin.sin_family=AF_INET;sin.sin_port=htons(8888); //组播端口号sin.sin_addr.s_addr=inet_addr("224.1.1.2"); //组播IPchar sbuf[128]="";while(1){//从终端获取数据printf("请输入>>>");fgets(sbuf,sizeof(sbuf),stdin);sbuf[strlen(sbuf)-1]=0;//发送数据sendto(sfd,sbuf,sizeof(sbuf),0,(struct sockaddr*)&sin,sizeof(sin));printf("发送成功\n");}//4.关闭套接字close(sfd);return 0;
}
接收端:
#include <myhead.h>
int main(int argc, const char *argv[])
{//1.创建套接字int rfd=socket(AF_INET,SOCK_DGRAM,0);if(rfd==-1){perror("socket error");return -1;}printf("rfd=%d\n",rfd);//2.加入多播组struct ip_mreqn imr;imr.imr_multiaddr.s_addr=inet_addr("224.1.1.2"); //组播ipimr.imr_address.s_addr=inet_addr("192.168.199.131"); //本机ipimr.imr_ifindex=2; //网卡编号if(setsockopt(rfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&imr,sizeof(imr))==-1){perror("setsockopt error");return -1;}//3.绑定//填充地址信息结构体struct sockaddr_in rin;rin.sin_family=AF_INET;rin.sin_port=htons(8888); //组播端口号rin.sin_addr.s_addr=inet_addr("224.1.1.2"); //组播ip//绑定if(bind(rfd,(struct sockaddr*)&rin,sizeof(rin))==-1){perror("bind error");return -1;}printf("bind success\n");//4.接收组播消息char rbuf[128]="";while(1){//清空消息bzero(rbuf,sizeof(rbuf));//接收消息recvfrom(rfd,rbuf,sizeof(rbuf),0,NULL,NULL);printf("收到的消息为:%s\n",rbuf);}//5.关闭套接字close(rfd);return 0;
}
效果图:

作业3:流式域套接字
服务器端:
#include <myhead.h>
int main(int argc, const char *argv[])
{//1.创建套接字int sfd=socket(AF_UNIX,SOCK_STREAM,0);if(sfd==-1){perror("socket error");return -1;}//2.判断文件是否存在,存在则删除if(access("./mysocket",F_OK)==0){//存在,删除if(unlink("./mysocket")==-1){perror("unlink error");return -1;}}//3.绑定//填充地址信息结构体struct sockaddr_un sun;sun.sun_family=AF_UNIX;strcpy(sun.sun_path,"./mysocket");//绑定if(bind(sfd,(struct sockaddr*)&sun,sizeof(sun))==-1){perror("bind error");return -1;}printf("bind success\n");//4.开启监听if(listen(sfd,128)==-1){perror("listen error");return -1;}//5.阻塞等待客户端连接struct sockaddr_un cun;socklen_t socklen=sizeof(cun);int newfd=-1;if((newfd=accept(sfd,(struct sockaddr*)&cun,&socklen))==-1){perror("accept error");return -1;}printf("您有新用户发来请求\n");//6.进行数据收发char rbuf[128]="";while(1){//清空数据bzero(rbuf,sizeof(rbuf));//接收数据recv(newfd,rbuf,sizeof(rbuf),0);printf("[%s]:%s\n",cun.sun_path,rbuf);strcat(rbuf," !!!");//发送消息send(newfd,rbuf,strlen(rbuf),0);printf("发送成功\n");}//7.关闭套接字close(sfd);close(newfd);return 0;
}
客户端:
#include <myhead.h>int main(int argc, const char *argv[])
{//1.创建套接字int cfd=socket(AF_UNIX,SOCK_STREAM,0);if(cfd==-1){perror("socket error");return -1;}//2.判断文件是否存在,存在则删除if(access("./mysocket1",F_OK)==0){//存在,删除if(unlink("./mysocket1")==-1){perror("unlink error");return -1;}}//3.绑定(非必须)//填充地址信息结构体struct sockaddr_un sun;sun.sun_family=AF_UNIX;strcpy(sun.sun_path,"./mysocket1");//绑定if(bind(cfd,(struct sockaddr*)&sun,sizeof(sun))==-1){perror("bind error");return -1;}printf("bind success\n");//4.连接服务器struct sockaddr_un cun;cun.sun_family=AF_UNIX;strcpy(cun.sun_path,"./mysocket");if(connect(cfd,(struct sockaddr*)&cun,sizeof(cun))==-1){perror("connect error");return -1;}printf("connect success\n");//5.进行数据收发char wbuf[128]="";while(1){//清空数据bzero(wbuf,sizeof(wbuf));//从终端获取数据printf("请输入>>>");fgets(wbuf,sizeof(wbuf),stdin);wbuf[strlen(wbuf)-1]=0;if(strcmp(wbuf,"quit")==0){break;}//发送消息send(cfd,wbuf,strlen(wbuf),0);printf("发送成功\n");//接收服务器发来的消息bzero(wbuf,sizeof(wbuf));recv(cfd,wbuf,sizeof(wbuf),0);printf("收到的消息为:%s\n",wbuf);}//7.关闭套接字close(cfd);return 0;
}
效果图:

作业4:报式域套接字
服务器端:
#include <myhead.h>
int main(int argc, const char *argv[])
{//1.创建套接字int sfd=socket(AF_UNIX,SOCK_DGRAM,0);if(sfd==-1){perror("socket error");return -1;}//2.判断文件是否存在,存在则删除if(access("./linux",F_OK)==0){//存在,删除if(unlink("./linux")==-1){perror("unlink error");return -1;}}//3.绑定//填充地址信息结构体struct sockaddr_un sun;sun.sun_family=AF_UNIX;strcpy(sun.sun_path,"./linux");//绑定if(bind(sfd,(struct sockaddr*)&sun,sizeof(sun))==-1){perror("bind error");return -1;}printf("bind success\n");//6.进行数据收发char rbuf[128]="";//定义地址信息结构体struct sockaddr_un cun;socklen_t socklen=sizeof(cun);while(1){//清空数据bzero(rbuf,sizeof(rbuf));//接收数据recvfrom(sfd,rbuf,sizeof(rbuf),0,(struct sockaddr*)&cun,&socklen);printf("收到的消息为:%s\n",rbuf);strcat(rbuf," !!!");//发送消息sendto(sfd,rbuf,strlen(rbuf),0,(struct sockaddr*)&cun,socklen);}//7.关闭套接字close(sfd);return 0;
}
客户端:
#include <myhead.h>int main(int argc, const char *argv[])
{//1.创建套接字int cfd=socket(AF_UNIX,SOCK_DGRAM,0);if(cfd==-1){perror("socket error");return -1;}//2.判断文件是否存在,存在则删除if(access("./linux1",F_OK)==0){//存在,删除if(unlink("./linux1")==-1){perror("unlink error");return -1;}}//3.绑定//填充地址信息结构体struct sockaddr_un sun;sun.sun_family=AF_UNIX;strcpy(sun.sun_path,"./linux1");//绑定if(bind(cfd,(struct sockaddr*)&sun,sizeof(sun))==-1){perror("bind error");return -1;}printf("bind success\n");//5.进行数据收发char wbuf[128]="";//定义地址信息结构体struct sockaddr_un cun;cun.sun_family=AF_UNIX;strcpy(cun.sun_path,"linux");while(1){//清空数据bzero(wbuf,sizeof(wbuf));//从终端获取数据printf("请输入>>>");fgets(wbuf,sizeof(wbuf),stdin);wbuf[strlen(wbuf)-1]=0;if(strcmp(wbuf,"quit")==0){break;}//发送消息sendto(cfd,wbuf,strlen(wbuf),0,(struct sockaddr*)&cun,sizeof(cun));printf("发送成功\n");//接收服务器发来的消息bzero(wbuf,sizeof(wbuf));recvfrom(cfd,wbuf,sizeof(wbuf),0,NULL,NULL);printf("收到的消息为:%s\n",wbuf);}//7.关闭套接字close(cfd);return 0;
}
效果图:

作业5:思维导图

相关文章:
多点通信与域套接字:2024/3/4
作业1:广播 发送端: #include <myhead.h> int main(int argc, const char *argv[]) {//1.创建套接字int sfdsocket(AF_INET,SOCK_DGRAM,0);if(sfd-1){perror("socket error");return -1;}printf("sfd%d\n",sfd);//2.设置当前…...
52.2k star! 自己部署gpt4free, 免费使用各种GPT
GPT4Free是一个由开发者Xtekky在GitHub上发布的开源项目,它可以免费地使用GPT-3.5、GPT-4、llama、gemini-pro、bard、claude等多种大模型。截止到当前(2024.1.30)已经有52.2k star,可见其受欢迎程度。 github地址:https://github.com/xtekky…...
【HbuilderX】 uniapp实现 android申请权限 和 退出app返回桌面
目录 android申请权限: 监听用户是否开启权限或关闭权限: 退出app返回桌面: android申请权限: 首先在 manifest.json 内添加你所需要用到权限 添加权限插件 permission.js 一次就好1/权限插件 - Gitee.comhttps://gitee.co…...
计算机网络之传输层 + 应用层
.1 CIDR地址块中还有三个特殊的地址块 a. 前缀 n 32 , 即32位IP地址都是前缀, 没有主机号, 这其实就是一个IP地址, 用于主机路由 b. 前缀 n 31 , 这个地址块中有两个IP地址, 主机号分别为0/1 , 这个地址块用于点对点链路 c. 前缀 n 0 , 用于默认路由使用二叉线索树查找转发…...
五、软考-系统架构设计师笔记-信息安全技术基础知识
信息安全技术基础知识 1、信息安全基础知识概述 信息安全的概念 信息安全包括 5 个基本要素: 机密性:确保信息不暴露给未授权的实体或进程。完整性:只有得到允许的人才能修改数据,并且能够判别出数据是否已被篡改。可用性:得到授权的实体在需要时可以…...
vue3+uniapp在微信小程序实现一个2048小游戏
一、效果展示 二、代码 <template><view class"page"><view class"top"><view class"score">得分:{{total}}</view><view class"time">用时:{{allTime}}s</view></view><view cl…...
常见的浏览器跨域解决方法
1. 前端方法:JSONP(仅适用于GET请求) JSONP(JSON with Padding)是一种利用<script>标签的src属性不受同源策略限制的特性来实现跨域数据请求的方法。JSONP通过在前端动态创建<script>标签,并将…...
飞桨模型转ONNX模型教程
文章目录 飞桨模型转ONNX模型教程1. ONNX简介2. Paddle2ONNX安装3. 获取Paddle2ONNX模型库4. 飞桨转ONNX教程4.1 飞桨训练模型导出为ONNX模型4.2 飞桨部署模型转为ONNX模型4.3 验证ONNX模型4.4 使用ONNX模型进行推理 5. 注意事项 飞桨模型转ONNX模型教程 1. ONNX简介 ONNX是一…...
vue使用swiper(轮播图)-真实项目使用
一、安装 我直接安装的vue-awesome-swiper": "^3.1.3"指定版本 npm install vue-awesome-swiper3.1.3 swiper --save二、vue页面使用,写了一个小demo <template><div class"vue-swiper"><h1>{{ msg }}</h1><…...
C++ 创建并初始化对象
创建并初始化C对象 当我们创建一个C对象时,它需要占用一些内存,即使我们写一个完全为空的类,类中没有成员,什么也没有,它至少也要占用一个字节的内存。但是我们类中有很多成员,它们需要存储在某地方&#…...
大数据可视化python01
import pandas as pd import matplotlib.pyplot as plt# 设置中文改写字体 plt.rcParams[font.sans-serif] [SimHei]# 读取数据 data pd.read_csv(C:/Users/wzf/Desktop/读取数据进行数据可视化练习/实训作业练习/瓜果类单位面积产量.csv ,encoding utf-8)#输出 print(data)…...
Java底层自学大纲_分布式篇
分布式专题_自学大纲所属类别学习主题建议课时(h)A 分布式锁001 Zookeeper实现分布式锁l-常规实现方式2.5A 分布式锁002 Zookeeper实现分布式锁II-续命&超时&羊群效应问题解决方案2.5A 分布式锁003 Zookeeper实现分布式锁III-基于Curator框架实现…...
Thread多线程(创建,方法,安全,通信,线程池,并发,并行,线程的生命周期)【全详解】
目录 1.多线程概述 2.多线程的创建 3.Thread的常用方法 4.线程安全 5.线程同步 6.线程通信 7.线程池 8.其它细节知识:并发、并行 9.其它细节知识:线程的生命周期 1.多线程概述 线程是什么? 线程(Thread)是一个程序内部的一条执行…...
自定义View中的ListView和ScrollView嵌套的问题
当我们在使用到ScrollView和ListView的时候可能会出现显示不全的问题。那我们可以进行以下分析 ScrollView在测量子布局的时候会用UNSPECIFIED。通过源码观察, 在ScrollView的onMeasure方法中 Overrideprotected void onMeasure(int widthMeasureSpec, int heightMe…...
支持向量机 SVM | 线性可分:硬间隔模型公式推导
目录 一. SVM的优越性二. SVM算法推导小节概念 在开始讲述SVM算法之前,我们先来看一段定义: 支持向量机(Support VecorMachine, SVM)本身是一个二元分类算法,支持线性分类和非线性分类的分类应用,同时通过OvR或者OvO的方式可以应用…...
【Unity实战】UGUI和Z轴排序那点事儿
如果读者是从Unity 4.x时代过来的,可能都用过NGUI这个插件(后来也是土匪成了正规军),NGUI一大特点是可以靠transform位移的Z值进行遮挡排序,然而这个事情在UGUI成了难题(Sorting Layer、Inspector顺序等因素…...
Vue/React 前端高频面试
说一说vue钩子函数 钩子函数是Vue实例创建和销毁过程中自动执行的函数。按照组件生命周期的过程分为:挂载阶段 -> 更新阶段 -> 销毁阶段。 每个阶段对应的钩子函数分别为:挂载阶段(beforeCreate,created,befor…...
[技巧]Arcgis之图斑四至范围批量计算
ArcGIS图层(点、线、面三类图形)四至范围计算 例外一篇介绍:[技巧]Arcgis之图斑四至点批量计算 说明:如下图画出来的框(范围标记不是很准) ,图斑的x最大和x最小,y最大,…...
C/C++工程师面试题(STL篇)
STL 中有哪些常见的容器 STL 中容器分为顺序容器、关联式容器、容器适配器三种类型,三种类型容器特性分别如下: 1. 顺序容器 容器并非排序的,元素的插入位置同元素的值无关,包含 vector、deque、list vector:动态数组…...
Effective Programming 学习笔记
1 基本语句 1.1 断言 在南溪看来,断言可以用来有效地确定编程中当前代码运行的前置条件,尤其是以下情况: 第三方工具库对输入数据的依赖,例如:minitouch库对Android版本的要求...
利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...
HubSpot推出与ChatGPT的深度集成引发兴奋与担忧
上周三,HubSpot宣布已构建与ChatGPT的深度集成,这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋,但同时也存在一些关于数据安全的担忧。 许多网络声音声称,这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么?它的作用是什么? Spring框架的核心容器是IoC(控制反转)容器。它的主要作用是管理对…...
自然语言处理——文本分类
文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益(IG) 分类器设计贝叶斯理论:线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别, 有单标签多类别文本分类和多…...
C/Python/Go示例 | Socket Programing与RPC
Socket Programming介绍 Computer networking这个领域围绕着两台电脑或者同一台电脑内的不同进程之间的数据传输和信息交流,会涉及到许多有意思的话题,诸如怎么确保对方能收到信息,怎么应对数据丢失、被污染或者顺序混乱,怎么提高…...
