3.18作业

一、网络属性(getsockopt、setsockopt)

1> 由于在网络通信过程中,套接字是服务于各个层的,但是,每一层中对套接字选项都有一定的权限控制,例如,应用层中对端口号快速重用的限制

2> 如何更改这些限制,可以通过上述两个函数完成,分别是获取套接字属性,以及设置套接字属性

3> 函数原型

       #include <sys/types.h>          /* See NOTES */#include <sys/socket.h>int getsockopt(int sockfd, int level, int optname,void *optval, socklen_t *optlen);功能:获取套接字对应层中相关属性参数1:套接字文件描述符参数2:网络体系结构的层SOL_SOCKET:应用层IPPROTO_TCP:tcp套接字的应用层IPPROTO_UDP:udp套接字的应用层IPPROTO_IP:网络层参数3:当前层中的指定属性,是一个宏值参数4:用于存储获取下来的当前属性的容器起始地址参数5:参数4的大小返回值:成功返回0,失败返回-1并置位错误码int setsockopt(int sockfd, int level, int optname,const void *optval, socklen_t optlen);功能:设置套接字对应层中相关属性参数1:套接字文件描述符参数2:网络体系结构的层SOL_SOCKET:应用层IPPROTO_TCP:tcp套接字的应用层IPPROTO_UDP:udp套接字的应用层IPPROTO_IP:网络层参数3:当前层中的指定属性,是一个宏值参数4:设置当前套接字选项的容器的起始地址,一般为int类型参数5:参数4的大小返回值:成功返回0,失败返回-1并置位错误码

#include<myhead.h>int main(int argc, const char *argv[])
{//创建套接字int sfd = socket(AF_INET, SOCK_STREAM, 0);if(sfd == -1){perror("socket error");return -1;}//获取当前套接字选项,查看是否默认允许端口号快速重用int reuse = -1;int reuselen = sizeof(reuse);//调用函数获取套接字属性if(getsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, &reuselen) == -1){perror("getsockopt error");return -1;}printf("reuse = %d\n", reuse);              //0//将端口号快速重用属性设置为启用int value = -1;if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &value, sizeof(value))==-1){perror("setsockopt error");return -1;}//调用函数获取套接字属性if(getsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, &reuselen) == -1){perror("getsockopt error");return -1;}printf("reuse = %d\n", reuse);              //1return 0;
}

二、单播

数据从一个发送者到一个接收者的数据传输方式叫做单播,之前学习的无论是TCP还是UDP通信都属于单播

三、广播

3.1 概念

1> 顾名思义就是实现一对多的通信,一个发送者可以对应对个接收者

2> 所有的接受者都能收到发送者发送的消息,无论接受者愿不愿意接受

3> 广播只能使用UDP实现

4> 广播地址:当前网络中主机号全为1的ip地址就是广播地址,例如:192.168.125.255

5> 广播消息不能穿过路由器

6> 广播需要对广播的发送者设置允许广播属性

3.2 广播的发送端流程 ---> 类似于UDP的客户端流程

1> socket:创建用于通信的套接字

2> setsockopt:设置允许广播,level:SOL_SOCKET, optname:SO_BROADCAST,属性类型:int

3> bind:非必须

4> 填充接收端地址信息结构体

ip:广播地址

port:和接收端保持一致

5> sendto:发送数据

6> close:关闭套接字

#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、设置当前套接字允许广播属性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 = htons(8888);sin.sin_addr.s_addr = inet_addr("192.168.125.255");//5、发送数据char sbuf[128] = "";while(1){printf("请输入>>>");fgets(sbuf, sizeof(sbuf), stdin);sbuf[strlen(sbuf)-1] = 0;sendto(sfd, sbuf, strlen(sbuf), 0, (struct sockaddr*)&sin, sizeof(sin));printf("发送成功\n");}//6、关闭close(sfd);return 0;
}

3.3 广播的接收端流程 ---> 类似UDP的服务器端流程

1> socket:创建套接字

2> 填充地址信息结构体

ip:广播地址

port:与发送端保持一致

3> bind:必须

4> recvfrom:接受消息

5> close:关闭套接字

 
#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);        //3//2、填充地址信息结构体struct sockaddr_in rin;rin.sin_family = AF_INET;     //地址族rin.sin_port = htons(8888);       //端口号rin.sin_addr.s_addr = inet_addr("192.168.125.255");  //广播地址//3、绑定if(bind(rfd, (struct sockaddr*)&rin, sizeof(rin)) == -1){perror("bind error");return -1;}//4、接收广播消息char rbuf[128] = "";while(1){//清空内容bzero(rbuf, sizeof(rbuf));//读取消息recv(rfd, rbuf, sizeof(rbuf), 0);printf("收到消息:%s\n", rbuf);}//5、关闭套接字close(rfd);return 0;
}

四、组播

4.1 概念

1> 组播也是实现同一网络下的一对多的通信方式

2> 对加入多播组的所有成员才能收到组播消息,并不是所有网络下的成员都能收到

3> 对于接收端需要进行设置,加入多播组,发送端无需特殊设置

4> 组播IP地址:D类网络地址【224.0.0.0 --- 239.255.255.255】

4.2 组播的发送端流程 ---> 类似于UDP的客户端流程

1> socket:创建套接字

2> bind:非必须

3> 填充地址信息结构体

ip:D类网络

port:与接收端保持一致

4> sendto:发送数据

5> close:关闭套接字

#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;}//2、绑定端口号和ip地址//填充地址信息结构体struct sockaddr_in rin;rin.sin_family = AF_INET;rin.sin_port = htons(9999);rin.sin_addr.s_addr = inet_addr("192.168.125.205");//绑定端口号和IPif(bind(rfd, (struct sockaddr*)&rin, sizeof(rin)) == -1){perror("bind error");return -1;}//3、发送消息//填充接收端地址信息结构体struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(8888);sin.sin_addr.s_addr = inet_addr("224.1.2.3");char sbuf[128] = "";while(1){printf("请输入>>>");fgets(sbuf, sizeof(sbuf), stdin);sbuf[strlen(sbuf)-1] = 0;//向组播地址中发送消息sendto(rfd, sbuf, strlen(sbuf), 0, (struct sockaddr*)&sin, sizeof(sin));printf("发送成功\n");}//4、关闭close(rfd);return 0;
}

4.3 组播的接收端流程 ---> 类似于UDP的服务器端流程

1> socket:创建套接字

2> setsockopt:加入多播组,level:IPPROTO_IP,optname:IP_ADD_MEMBERSHIP,类型:struct

 struct ip_mreqn {struct in_addr imr_multiaddr; /* IP multicast groupaddress */    组播地址struct in_addr imr_address;   /* IP address of localinterface */  主机IP地址int            imr_ifindex;   /* interface index */    网卡接口索引    ifconfig可以查看网卡名称, ip ad查看网卡对应的编号索引也可以天0,表示系统默认选择};

3> bind:绑定

ip:组播IP

port:与接收端保持一致

4> sendto:发送数据

5> close:关闭

#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);        //3//设置加入多播族struct ip_mreqn imr;imr.imr_multiaddr.s_addr = inet_addr("224.1.2.3");  //组播ipimr.imr_address.s_addr = inet_addr("192.168.125.205"); //本地ipimr.imr_ifindex = 2;        //网卡编号if(setsockopt(rfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &imr, sizeof(imr)) == -1){perror("setsockopt error");return -1;}//2、填充地址信息结构体struct sockaddr_in rin;rin.sin_family = AF_INET;     //地址族rin.sin_port = htons(8888);       //端口号rin.sin_addr.s_addr = inet_addr("224.1.2.3");  //组播地址//3、绑定if(bind(rfd, (struct sockaddr*)&rin, sizeof(rin)) == -1){perror("bind error");return -1;}//4、接收组播消息char rbuf[128] = "";while(1){//清空内容bzero(rbuf, sizeof(rbuf));//读取消息recv(rfd, rbuf, sizeof(rbuf), 0);printf("收到消息:%s\n", rbuf);}//5、关闭套接字close(rfd);return 0;
}

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

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

相关文章

vue2 自定义 v-model (model选项的使用)

效果预览 model 选项的语法 每个组件上只能有一个 v-model。v-model 默认会占用名为 value 的 prop 和名为 input 的事件&#xff0c;即 model 选项的默认值为 model: {prop: "value",event: "input",},通过修改 model 选项&#xff0c;即可自定义v-model …

js实现旋转矩形,圆形交集并集差集运算并使用canvas展示

region 使用0代表空 1代表有 复制到codepen执行 // 创建三个 Canvas 元素 const intersectionCanvas document.createElement(canvas); const unionCanvas document.createElement(canvas); const differenceCanvas document.createElement(canvas);intersectionCanvas.wid…

本人用编译

板子方 修改ip&#xff08;保证板子和主机在同一个网段&#xff09; mount -t nfs -o rw,nolock,nfsvers3 192.168.1.200:/home/violet/nfs get/ 互通的文件在~目录下get文件内 电脑方 使用arm-linux-gnueabihf-gcc 编译

AI新工具(20240322) 免费试用Gemini Pro 1.5;先进的AI软件工程师Devika;人形机器人Apptronik给你打果汁

✨ 1: Gemini Pro 1.5 免费试用Gemini Pro 1.5 Gemini 1.5 Pro是Gemini系列模型的最新版本&#xff0c;是一种计算高效的多模态混合专家&#xff08;MoE&#xff09;模型。它能够从数百万个上下文Token中提取和推理细粒度信息&#xff0c;包括多个长文档和数小时的视频、音频…

C++读取文本文件中的汉字出现乱码的原因及解决措施

大家好&#xff01; 作者今天在写代码时遇到了读取文本文件中的汉字时出现乱码的情况&#xff0c;所以本文介绍Windows操作系统中&#xff0c;C读取文本文件中的汉字出现乱码情况原因及解决措施。 下面代码可以读取Stu.txt中的内容并输出&#xff1a; ifstream ifs; ifs.open(…

拌合楼管理软件开发(十一) 海康威视车牌识别摄像头安装调试,记录犯经验主义错误不断自己打脸过程

前言: 从小白开始 海康威视的摄像头接触过,包括前面也都开发了调用sdk开发拍照和视频预览,以及通过事件警报获取数据的。接触到的像头都是12v或者24v电源&#xff0c;或者是POE供电的&#xff0c;先入为主了觉得都是这样&#xff0c;结果打脸了。 一、设备选型&#xff1a; 最开…

MySQL 经典练习 50 题 (记录)

前言&#xff1a; 记录一下sql学习&#xff0c;仅供参考基本都对了&#xff0c;不排除有些我做的太快做错了。里面sql不存在任何sql优化操作&#xff0c;只以完成最后输出结果为目的&#xff0c;包含我做题过程和思路最后一行才是结果。 1.过程: 1.1.插入数据 /* SQLyog Ul…

【机器学习入门 】人工神经网络(一)

系列文章目录 第1章 专家系统 第2章 决策树 第3章 神经元和感知机 识别手写数字——感知机 第4章 线性回归 第5章 逻辑斯蒂回归和分类 第5章 支持向量机 文章目录 系列文章目录前言一、多层感知机二、反向传播算法三、深度神经网络 前言 人工神经网络( Artifical Neural Netw…

蓝桥杯-02-2023蓝桥杯c/c++省赛B组题目

参考 2023 年第十四届蓝桥杯 C/C B组省赛题解 2023蓝桥杯c/c省赛B组题目(最全版)&#xff1a; A&#xff1a;日期统计 这题方法应该很多&#xff0c;没有和别人讨论想法。我的解法思路是&#xff1a;先 load 函数生成所有这一年的合法日期&#xff0c;然后枚举所有可以从数据…

uni-app打包证书android

Android平台打包发布apk应用&#xff0c;需要使用数字证书&#xff08;.keystore文件&#xff09;进行签名&#xff0c;用于表明开发者身份。 Android证书的生成是自助和免费的&#xff0c;不需要审批或付费。 可以使用JRE环境中的keytool命令生成。 以下是windows平台生成证…

MySQL、Oracle的时间类型字段自动更新:insert插入、update更新时,自动更新时间戳。设置自增主键id,oracle创建自增id序列和触发器

1. MySQL 支持设置自增id的字段类型&#xff1a;int、bigint、double等数值类型&#xff0c;一般用int、bigint支持设置自动更新时间的字段类型&#xff1a;datetime、timestamp下面sql中的now()函数可以用current_timestamp()替代 1.1. 不指定秒精度 drop table if exists …

Ollama 在本地快速部署大型语言模型,可进行定制并创建属于您自己的模型

# Ollama 在本地快速部署并运行大型语言模型。 macOS 点击下载 Windows 预览版 点击下载 Linux curl -fsSL https://ollama.com/install.sh | sh手动安装指南 Docker 官方的 Ollama Docker 镜像 ollama/ollama 已经在 Docker Hub 上发布。 库 ollama-pythonollama-js…

超详细测试项目——Web电商项目测试点整理.....

虽然说近些年来&#xff0c;软件测试找工作的时候&#xff0c;简历中如果写着电商项目被认为是烂大街的项目&#xff0c;甚至受到根本不了解行情的HR或者部分公司的技术人员的刁难&#xff0c;但是&#xff1a;电商这么流行普遍的项目和应用&#xff0c;这不是很正常么&#xf…

阿里云2核4G云服务器165元一年,ECS u1优惠价格199元一年

阿里云2核4G服务器租用优惠价格&#xff0c;轻量2核4G服务器165元一年、u1服务器2核4G5M带宽199元一年、云服务器e实例30元3个月&#xff0c;活动链接 aliyunfuwuqi.com/go/aliyun 活动链接如下图&#xff1a; 阿里云2核4G服务器优惠价格 轻量应用服务器2核2G4M带宽、60GB高效…

Visual Studio 2013 - 高亮设置突出显示的引用

Visual Studio 2013 - 高亮设置突出显示的引用 1. 高亮设置 突出显示的引用References 1. 高亮设置 突出显示的引用 工具 -> 选项… -> 环境 -> 字体和颜色 References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

Flutter 事件传递简单概述、事件冒泡、事件穿透

前言 当前案例 Flutter SDK版本&#xff1a;3.13.2 本文对 事件传递只做 简单概述&#xff0c;主要讲解&#xff0c;事件传递过程中可能遇到的问题解决&#xff0c;比如 事件冒泡、事件穿透&#xff1b; 不是我偷懒&#xff0c;是自认为没有这几位写的详细、仔细&#xff0c…

乐优商城(九)数据同步RabbitMQ

1. 项目问题分析 现在项目中有三个独立的微服务&#xff1a; 商品微服务&#xff1a;原始数据保存在 MySQL 中&#xff0c;从 MySQL 中增删改查商品数据。搜索微服务&#xff1a;原始数据保存在 ES 的索引库中&#xff0c;从 ES 中查询商品数据。商品详情微服务&#xff1a;做…

【力扣hot100】128.最长连续序列

给定一个未排序的整数数组 nums &#xff0c;找出数字连续的最长序列&#xff08;不要求序列元素在原数组中连续&#xff09;的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1&#xff1a; 输入&#xff1a;nums [100,4,200,1,3,2] 输出&#xff1a;4 解…

JavaSE:类与对象

目录 一、前言 二、类与对象的介绍 1.类的定义格式 三、类的实例化 1.类的实例化介绍 2.成员初始化 3.类中方法的实现 四、封装 1.private实现封装 2.getter和setter方法 五、构造方法的使用 1.构造方法的介绍 2.构造方法的特性 六、this引用 1.this的介绍 2.th…

rfc793-page36

rfc793原文 If the connection is in any non-synchronized state (LISTEN,SYN-SENT, SYN-RECEIVED), and the incoming segment acknowledgessomething not yet sent (the segment carries an unacceptable ACK), orif an incoming segment has a security level or compart…