网络编程基础(四)

目录

前言

 二、多点通信

2.1 单播

2.2 广播

2.2.1 广播得发送端实现--》类似与UDP的客户端

 2.3 组播

2.3.1 组播发送端流程--》类似于UDP的客户端流程

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


前言

多点通信


一、套接字选项得获取和设置

 int getsockopt(int sockfd, int level, int optname,void *optval, socklen_t *optlen);int setsockopt(int sockfd, int level, int optname,const void *optval, socklen_t optlen);功能:获取或设置套接字在不同层级上的相关属性参数1:要获取或设置的套接字文件描述符参数2:表示要获取或设置的层应用层:SOL_SOCKET传输层TCP:IPPROTO_TCP传输层UDP:IPPROTO_UDP网络层:IPPROTO_IP参数3:当前层的属性名称,见下表所示参数4:要获取或设置的属性值的起始地址参数5:参数4的大小返回值:成功返回0,失败返回-1并置位错误码

 

1.代码演示

#include<myhead.h>int main(int argc, const char *argv[])
{//1、创建一个套接字文件描述符int sfd = socket(AF_INET, SOCK_STREAM, 0);if(sfd == -1){perror("socket error");return -1;}//2、获取地址快速重用属性的值int res = -1;              //接收属性值int reslen = sizeof(res);  //接收属性的大小if(getsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &res, &reslen)==-1){perror("getsockopt error");return -1;}//程序执行至此,就获取了默认是否能地址快速重用printf("res = %d\n", res);          //0表示默认不能快速重用//3\、设置地址能够快速重用int reuse = 1;if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse))==-1){perror("setsockopt error");return -1;}//4、再重新获取一次,判断是否设置成功res = -1;if(getsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &res, &reslen)==-1){perror("getsockopt error");return -1;}//程序执行至此,就获取了默认是否能地址快速重用printf("res = %d\n", res);                  //1表示已经设置成功了return 0;
}

 二、多点通信

2.1 单播

1.主机之间存在的是一对一的通信方式,交换机以及路由器对数据只进行转发,不进行复制

2.每次只有两个实体之间进行相互通信,发送端和接收端都是唯一确定的

2.2 广播

1.广播是允许通信实体之间完成一对多的通信方式,网络对其中每一台发送数据的主机信息都进行无条件的复制后并转发给其他所有主机

2.所有主机都会收到广播消息(不管是都愿意接受)

3.广播只能由UDP通信方式来实现

4.广播消息,只能在当前网络下进行转播,不允许传过路由器

5.广播地址:网络号+255

6.官博分为发送端和接收端实现

2.2.1 广播得发送端实现--》类似与UDP的客户端

1、创建用于通信的套接字文件描述符:socket
2、设置该套接字允许发送广播消息:setsockopt     ---> SOL_SOCKET  ---> SO_BROADCAST
3、绑定IP地址和端口号(可选)
4、向广播地址发送数据:sendto广播地址IP:网络号 + 255端口号:与接收端保持一致
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:广播地址//port:与发送端保持一致struct sockaddr_in rin;rin.sin_family = AF_INET;rin.sin_port = htons(6666);     //端口号rin.sin_addr.s_addr = inet_addr("192.168.125.255"); //广播ip地址//3、绑定端口号和IP地址(必须)if(bind(rfd, (struct sockaddr*)&rin, sizeof(rin)) == -1){perror("bind error");return -1;}//4、接受发送端发来的消息:recvfromchar rbuf[128] = "";while(1){//清空容器bzero(rbuf, sizeof(rbuf));//读取数据recv(rfd, rbuf, sizeof(rbuf), 0);//展示printf("收到广播消息:%s\n", rbuf);//判断广播是否结束if(strcmp(rbuf, "over") == 0){break;}}//5、关闭套接字:closeclose(rfd);return 0;
}

2.2.2 广播的接收端--》类似于UDP的服务器端 

1、创建用于通信的套接字文件描述符
2、填充地址信息结构体:ip:广播地址port:与发送端保持一致
3、绑定端口号和IP地址(必须)
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;}//2、填充地址信息结构体://ip:广播地址//port:与发送端保持一致struct sockaddr_in rin;rin.sin_family = AF_INET;rin.sin_port = htons(6666);     //端口号rin.sin_addr.s_addr = inet_addr("192.168.125.255"); //广播ip地址//3、绑定端口号和IP地址(必须)if(bind(rfd, (struct sockaddr*)&rin, sizeof(rin)) == -1){perror("bind error");return -1;}//4、接受发送端发来的消息:recvfromchar rbuf[128] = "";while(1){//清空容器bzero(rbuf, sizeof(rbuf));//读取数据recv(rfd, rbuf, sizeof(rbuf), 0);//展示printf("收到广播消息:%s\n", rbuf);//判断广播是否结束if(strcmp(rbuf, "over") == 0){break;}}//5、关闭套接字:closeclose(rfd);return 0;
}

 2.3 组播

1.由于广播通信过程中,会占用大量的网络宽带,影响正常通信,如果通信的主机较少的话,可以引入组播

2.组播也是实现主机之间一对多的通信方式

3.要求所有接收端主机加入多播组,只有加入多播组的主机才能收到消息

4.对于发送端而言,只需向该多组播中发送消息即可,无需其他设置

5.组播也是使用UDP实现的

6.组播地址:D类网络【224.0.0.0---239.255.255.255】

7.组播也分为发送端和接收端

2.3.1 组播发送端流程--》类似于UDP的客户端流程

1、创建用于通信的套接字文件描述符:socket
2、绑定IP地址和端口号(可选)
3、向组播地址发送数据:sendto广播地址IP:【224.0.0.0 --- 239.255.255.255】端口号:与接收端保持一致
4、关闭套接字:close

代码实现:

 

#include<myhead.h>int main(int argc, const char *argv[])
{//1、创建用于通信的套接字文件描述符:socketint sfd = socket(AF_INET, SOCK_DGRAM, 0);if(sfd == -1){perror("socket error");return -1;}//2、绑定IP地址和端口号(可选)//3、向组播地址发送数据:sendto//广播地址IP:【224.0.0.0 --- 239.255.255.255】//端口号:与接收端保持一致struct sockaddr_in rin;rin.sin_family = AF_INET;rin.sin_port = htons(5555);rin.sin_addr.s_addr = inet_addr("224.1.2.3");//数据的发送//发送数据char wbuf[128] = "";while(1){//从终端获取数据fgets(wbuf, sizeof(wbuf), stdin);wbuf[strlen(wbuf)-1] = 0;//发送给广播消息sendto(sfd, wbuf, strlen(wbuf), 0, (struct sockaddr*)&rin, sizeof(rin));printf("发送成功\n");//判断发送的消息if(strcmp(wbuf, "over") == 0){break;}}//5、关闭套接字:closeclose(sfd);return 0;
}

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

1、创建用于通信的套接字文件描述符:socket
2、将该套接字加入多播组:setsockopt   --->  IPPROTO_IP    --> IP_ADD_MEMBERSHIP   
属性类型:struct ip_mreqn {struct in_addr imr_multiaddr; /* 组播地址 */struct in_addr imr_address;   /* 主机ip地址 */int            imr_ifindex;   /* 设备索引,可以通过 ip ad指令查看, 也可以填0,表示使用默认的索引*/};3、填充地址信息结构体:ip:组播地址port:与发送端保持一致
4、绑定端口号和IP地址(必须)
5、接受发送端发来的消息:recvfrom
6、关闭套接字:close

代码实现:

#include<myhead.h>int main(int argc, const char *argv[])
{//1、创建用于通信的套接字文件描述符:socketint rfd = socket(AF_INET, SOCK_DGRAM, 0);if(rfd == -1){perror("socket error");return -1;}//2、将该套接字加入多播组:setsockopt   --->  IPPROTO_IP    --> IP_ADD_MEMBERSHIP struct ip_mreqn  imr;imr.imr_multiaddr.s_addr = inet_addr("224.1.2.3");imr.imr_address.s_addr = inet_addr("192.168.125.113");imr.imr_ifindex = 2;//设置套接字选项,加入多播组if(setsockopt(rfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &imr, sizeof(imr))==-1){perror("setsockopt error");return -1;}//3、填充地址信息结构体://ip:组播地址//port:与发送端保持一致struct sockaddr_in rin;rin.sin_family = AF_INET;rin.sin_addr.s_addr = inet_addr("224.1.2.3");rin.sin_port = htons(5555);//4、绑定端口号和IP地址(必须)if(bind(rfd, (struct sockaddr*)&rin, sizeof(rin)) == -1){perror("bind error");return -1;}//5、接受发送端发来的消息:recvfromchar rbuf[128] = "";while(1){//清空容器bzero(rbuf, sizeof(rbuf));//读取数据recv(rfd, rbuf, sizeof(rbuf), 0);//展示printf("收到广播消息:%s\n", rbuf);//判断广播是否结束if(strcmp(rbuf, "over") == 0){break;}}//6、关闭套接字:closeclose(rfd);return 0;
}

 


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

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

相关文章

Owinps静态IP代理:跨境电商的优选解决方案

在快速发展的电子商务领域&#xff0c;尤其是跨境电商行业&#xff0c;网络的稳定性和安全性是成功经营的关键因素之一。在这背后&#xff0c;少不得一个重要的跨境电商工具——代理IP&#xff0c;而这其中&#xff0c;静态IP因其独特的稳定性和安全性&#xff0c;正逐渐成为众…

linux中使用gdb调试c++的dump文件

1 查看系统是否开启dump生成 0表示没开启 ulimit -c 但是这个只是针对当前这个连接&#xff0c;如果想要永久修改可以修改配置文件&#xff1a;vim /etc/profile&#xff0c;然后添加上面的命令ulimit - c unlimited.然后执行source /etc/profile或者重启使刚刚的配置可以…

数控六面钻选购指南:如何挑选一款高效、精准的加工利器?

在木工家具、门窗制造等行业中&#xff0c;数控六面钻凭借其高效、精准的特点&#xff0c;逐渐成为现代生产线上的必备设备。然而&#xff0c;市场上的数控六面钻品牌众多&#xff0c;性能各异&#xff0c;如何选购一款适合自己的设备呢&#xff1f;本文将为您提供一份实用的选…

【稀疏三维重建】pixelSplat:仅需两张图,重建3D Gaussian Splats

文章目录 一.摘要二、相关工作 , 背景(gs)三、基于图像的三维高斯预测3.1 双视图图像编码器&#xff08;解决尺度模糊性&#xff09;3.2 &#xff08;像素对齐的&#xff09;高斯参数预测 四、实验效果 论文&#xff1a;《pixelSplat: 3D Gaussian Splats from Image Pairs for…

动态规划之买卖股票大集合

目录 引言 1.只能进行一次买卖股票&#xff08;最多只能买一股股票&#xff09; 2.可以进行多次股票买卖&#xff0c;且没有手续费&#xff08;最多只能买一股股票&#xff09; 3.可以进行多次股票买卖&#xff0c;但是有冷冻期&#xff0c;无手续费&#xff08;最多只能买一…

常用压力、流量单位换算表

一、压力为单位面积所承受的力 压力&#xff1a;绝对压力 、表压力 、大气压力。相互关系&#xff1a;绝对压力表压力大气压力 绝对压力:当压力表示与完全真空的差。测量处的实际压力。 表压力:当表示其气体数值与该地域大气压力的差值。 大气压力&#xff1a;由大气重量所…

基于C++11实现的手写线程池

在实际的项目中&#xff0c;使用线程池是非常广泛的&#xff0c;所以最近学习了线程池的开发&#xff0c;在此做一个总结。 源码&#xff1a;https://github.com/Cheeron955/Handwriting-threadpool-based-on-C-17 项目介绍 项目分为两个部分&#xff0c;在初版的时候&#x…

让EXCEL VBA支持鼠标滚轮,vb6 IDE鼠标滚轮插件原理

vb6 IDE鼠标滚轮插件怎么运行的(适用于VBA) 使用 Spy&#xff0c;我发现代码窗口正在获取 WM_MOUSEWHEEL 事件&#xff0c;但没有触发 WM_VSCROLL 消息。因此&#xff0c;我编写了一个简单的消息钩子&#xff0c;当它捕获鼠标滚轮事件时触发滚动事件。 我从 Spy 得知代码窗口的…

SQL数据库多层嵌套 json转sql建表语句,SQL数据库里数组里对象数据怎么创建

1. uniapp sqlite 一个数组包含对象嵌套对象通过主外键方式插入数据库&#xff1a; // 假设有一个对象数组&#xff0c;对象中包含嵌套对象 const objectsArray [{parentObject: {id: 1,name: Parent 1,// 其他父对象属性},childObject: {id: 11,parentId: 1,name: Child 1 o…

截图工具分享(Snipaste、FastStone Capture)

目录 一、背景二、Snipaste 截图工具三、FastStone Capture 截图工具 一、背景 在我们日常的学习、工作中&#xff0c;经常会需要使用到各种各样的截图场景&#xff0c;甚至有部分同学还不知道仅仅通过截图的运用就可以大大提升自己的学习效率和工作效率。在这篇文章中&#xf…

如何解决链游中可能出现的延迟或网络拥堵问题?

随着区块链技术的不断发展和普及&#xff0c;链游&#xff08;基于区块链的游戏&#xff09;作为新兴的娱乐形式&#xff0c;正逐渐走进大众的视野。然而&#xff0c;与传统游戏相比&#xff0c;链游在运行过程中可能会遇到一些特有的问题&#xff0c;其中最为突出的就是延迟和…

宝塔下应该用 Memcached 还是 Redis?

明月最近在跟几个使用宝塔面板的客户运维的时候发现不少站长不知道如何选择 Memcached 和 Redis&#xff0c;甚至都说不清楚 Memcached 或者 Redis 具体是用来干啥的&#xff1f;甚至还碰到过一个站长 Memcached 和 Redis 都安装了&#xff0c;但一个都没有用&#xff0c;就那么…

希尔排序法

希尔排序为插入排序的优化&#xff0c;即将数组分组&#xff0c;将每一组进行插入排序&#xff0c;每一组排成有序后&#xff0c;最后整体就变有序了。 上面gap2&#xff0c;即5&#xff0c;14&#xff0c;18&#xff0c;27&#xff0c;68为一组&#xff1b;13&#xff0c;20&a…

Numba 的 CUDA 示例(1/4):踏上并行之旅

按照本系列从头开始使用 Python 学习 CUDA 编程 介绍 GPU&#xff08;图形处理单元&#xff09;&#xff0c;顾名思义&#xff0c;最初是为计算机图形学开发的。从那时起&#xff0c;它们几乎在每个需要高计算吞吐量的领域都无处不在。这一进步得益于 GPGPU&#xff08;通用 G…

Java基础:基本语法(一)

Java基础&#xff1a;基本语法&#xff08;一&#xff09; 文章目录 Java基础&#xff1a;基本语法&#xff08;一&#xff09;1. 前言2. 开发环境搭建2.1 Java开发工具包下载2.2 环境变量配置2.3 Java程序的运行过程 3. 数据类型3.1 基本数据类型3.2 引用数据类型 4. 常量与变…

opencascade V3d_PositionLight V3d_SpotLight 源码学习 (位置性)光源

Positional、Spot 和 Directional Light 类的基类。 类V3d_SpotLight 创造和修改光源的衰减因子 F 决定了表面的照明&#xff1a; F 1 / (ConstAttenuation() LinearAttenuation() * Distance) 其中 Distance 是从光源到表面的距离。默认值 (1.0, 0.0) 对应最小的衰减。浓…

【做一道算一道】力扣332.重新安排行程

332.重新安排行程 给定一个机票的字符串二维数组 [from, to]&#xff0c;子数组中的两个成员分别表示飞机出发和降落的机场地点&#xff0c;对该行程进行重新规划排序。所有这些机票都属于一个从 JFK&#xff08;肯尼迪国际机场&#xff09;出发的先生&#xff0c;所以该行程必…

navicat连接过的库忘记密码

1、点击文件->导出连接 2、勾选想要知道密码的库 3、打开导出的文件搜索Password 4、复制Password解密 把下面的php代码复制到在线运行php的网站&#xff0c;替换最下面的decrypt(‘B7246A6E64D4F50A563FA20427A47991’)括号里的内容&#xff0c;然后执行php代码&#xff0…

Linux--进程间通信(1)(匿名管道)

目录 1.了解进程通信 1.1进程为什么要通信 1.2 进程如何通信 1.3进程间通信的方式 2.管道 2.1管道的初步理解 2.2站在文件描述符的角度-进一步理解管道 2.3 管道的系统调用接口&#xff08;匿名管道&#xff09; 2.3.1介绍接口函数&#xff1a; 2.3.2编写一个管道的代…

通过date命令给日志文件添加日期

一、背景 服务的日志没有使用日志工具&#xff0c;每次重启后生成新日志文件名称相同&#xff0c;新日志将会把旧日志文件冲掉&#xff0c;旧日志无法保留。 为避免因旧日志丢失导致无法定位问题&#xff0c;所以需要保证每次生成的日志文件名称不同。 二、解决 在启动时&am…