计网----使用代码实现C/S模型的数据通信,IP地址分类,子网掩码,网关,广播地址,非默认子网掩码,子网划分的常见问题

news2024/11/17 22:26:07

计网----使用代码实现C/S模型的数据通信,IP地址分类,子网掩码,网关,广播地址,非默认子网掩码,子网划分的常见问题

一.使用代码实现C/S模型的数据通信(七层网络系统的博客https://blog.csdn.net/m0_73483024/article/details/133916201?spm=1001.2014.3001.5502的后续)

创建一个客户端

1.创建一个新项目(选的是空项目)

在这里插入图片描述

2在该项目下创建一个文件,在该文件中进行客户端代码的实现如下
#include<iostream>
#include<winsock2.h>
using namespace std;

#pragma comment(lib,"Ws2_32.lib")
int main() {

	//1.加载库
	WORD version = MAKEWORD(2, 2);

	WSADATA data;

	int err=WSAStartup(version, &data);

	if (err != 0) {
		cout << "WSAStartup error" << endl;
		return 1;
	}

	if (LOBYTE(data.wVersion) != 2 || HIBYTE(data.wVersion) != 2) {
		WSACleanup();
		return 1;
	}

	else {
		cout << "WSAStartup suuccess" << endl;
	}
	//2.创建套接字
	SOCKET sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
	if (sock == INVALID_SOCKET) {
		cout << "socket error" << endl;

		cout << WSAGetLastError() << endl;

		WSACleanup();//此函数没有参数
		return 1;
	}
	else {
		cout << "socket success" << endl;
	}
    //创建一个sockaddr_in结构体的变量,并存一下服务端的地址信息(IP地址、端口号)
	sockaddr_in addServer;
	addServer.sin_family = AF_INET;
	addServer.sin_port = htons(666666);
	addServer.sin_addr.S_un.S_addr = inet_addr("192.168.3.111");//因为存地址的这个变量存的是u_long类型,所以这里将字符串类型转化成u_long类型

	int addrlength = sizeof(addServer);
	int recv = 0;
	int send = 0;
	char recvData[1024] = "";
	char sendData[1024] = "";
	
	while (true) {
		//3.发送数据(发送数据的时候,会自动给这个应用程序分配IP地址和端口号)
		cin >> sendData;
		send = sendto(sock, sendData, sizeof(sendData), 0, (sockaddr*)&addServer, addrlength);
		if (send == SOCKET_ERROR) {
			cout << "send failed  " << WSAGetLastError() << endl;
			break;
		}
        
		//4.接收数据
		recv = recvfrom(sock, recvData, sizeof(recvData), 0, NULL, NULL);
		if (recv > 0) {
			cout << "IP:" << inet_ntoa(recvaddr.sin_addr) << "     "<< "SAY: " << recvData << endl;
		}
		else {//失败
			cout << "recv failed  " << WSAGetLastError() << endl;
			break;
		}
	}
	

	//5.关闭套接字
	closesocket(sock);
	//6.卸载库
	WSACleanup();
	return 0;
}

二.IP地址分类(以IPV4地址为例来说的)

1.IP地址的分类

1.A类

范围:1.0.0.0~127.255.255.255(1的二进制是0000 0001)

作用:大量主机,公网

公网的好处:无论在什么地方访问公网中的服务器,IP地址都不发生改变

2.B类

范围:128.0.0.0~191.255.255.255(128的二进制是1000 0000)

作用:国际大公司,政府

3.C类

范围:192.0.0.0~223.255.255.255(192的二进制是1100 0000)

作用:小公司,校园网,科研公司

4.D类

范围:240.0.0.0~239.255.255.255(224的二进制是1110 0000)

作用:组播

5.E类

范围:240.0.0.0~255.255.255.255(240的二进制是1111 0000)

作用:保留

2.私网

1.A类

0.0.0.0~0.255.255.255保留

127.0.0.0~127.255.255.255系统回环测试(localhost 127.0.0.1,填写此地址后,不管本地主机的IP地址怎么变都是发送给自己)

10.0.0.0~10.255.255.255政府预留

2.B类

172.16.0.0~172.31.255.255

3.C类

192.168.0.0~192.168.255.25

三.子网掩码

1.什么是子网

为了方便管理,把一个大的网络,分成小的网络就叫子网

2.什么是子网掩码

子网掩码又叫网络掩码,地址掩码,子网络遮罩,就是说把自网络遮起来了,不让外界窥探到

注意:我们在设置IP地址时,一定要设置子网掩码,否则无法设置IP地址

3.子网掩码是如何发挥作用的(举例子)

1.IPV4地址

192.168.3.100(十进制)

11000000.10101000.00000011.01100100(二进制)

2.默认子网掩码

255.255.255.0(十进制)

11111111.11111111.11111111.00000000(二进制)

注意:子网掩码的1和0都是连续的

3.IPV4地址与默认子网掩码进行按位与操作得到网络地址(对外的IP地址)

提示:不在当前设备的路由器下,就是外面

按位与得到的结果如下

192.168.3.0(十进制)

11000000.10101000.00000011.00000000(十进制)

这里的前三个十网络号,最后一个是主机号(此主机号被隐藏了,真正的主机号是100(十进制),01100100(二进制))

注意:1.网络地址中非零的是网络号,为零的是主机号

​ 2.如果网络地址相同说明在一个子网内

4.各类地址默认的子网掩码

1.A类

默认的子网掩码为

255.0.0.0(十进制)

11111111.00000000.00000000.00000000(二进制)

2.B类

默认的子网掩码为

255.255.0.0(十进制)

11111111.11111111.00000000.00000000(二进制)

2.C类

默认的子网掩码为

255.255.0.0(十进制)

11111111.11111111.11111111.00000000(二进制)

四.网关

1.什么是网关

网关又称网间连接器,协议转换器。网间连接器,就是连接两个子网之间的设备或软件,如下图

在这里插入图片描述

注意:网关都是具有路由功能的IP地址,就是说网关必须要有路由功能,默认的主机号都是0,这样才是网关。比如说网络A的网关IP地址就应该是192.18.1.0,网络B的网关地址就应该是192.18.2.0

五.广播地址

1.广播地址的功能

用于向网络中的所有的设备进行广播

2.广播地址的分类

1.直接广播地址

具有正常的网络号部分,而主机号部分全为1的IP地址称之为直接广播地址

发送直接广播地址数据,会将数据发送给指定的子网内的所有主机

2.有限广播地址

指的是32位全为1(即255.255.255.255)的IP地址,用于本网广播

发送有限广播地址数据,只能将数据发送给本网网络中的所有主机

3.使用广播地址传输数据

我们将上面客户端传输数据的方式从单播变为直接广播/间接广播,并且让客户端只能发送数据

1.直接广播
//创建一个sockaddr_in结构体的变量,并存一下服务端的地址信息(IP地址、端口号)
	sockaddr_in addServer;
	addServer.sin_family = AF_INET;
	addServer.sin_port = htons(666666);

	//将单播换成直接广播

	//单播
	//addServer.sin_addr.S_un.S_addr = inet_addr("192.168.3.111");//将字符串类型转化成u_long类型

	//直接广播
	addServer.sin_addr.S_un.S_addr = inet_addr("192.168.3.255");
2.有限广播
//创建一个sockaddr_in结构体的变量,并存一下服务端的地址信息(IP地址、端口号)
	sockaddr_in addServer;
	addServer.sin_family = AF_INET;
	addServer.sin_port = htons(666666);

	//将单播换成有限广播

	//单播
	//addServer.sin_addr.S_un.S_addr = inet_addr("192.168.3.111");//将字符串类型转化成u_long类型

	//有线广播(注意使用有限广播是还需要申请一个有限g)
	addServer.sin_addr.S_un.S_addr = inet_addr("255.255.255.255");

	//申请有限广播权限
	bool value = true;
	
	setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char*)&value, sizeof(value));

六.非默认子网掩码

1.非默认子网掩码与默认子网掩码的区别

非默认子网掩码一定比默认子网掩码长

2.非默认子网掩码是如何发挥作用的(举例子)

1.IPV4地址

192.168.3.100(十进制)

11000000.10101000.00000011.01100100(二进制)

2.非默认子网掩码

255.255.255.248(十进制)

11111111.11111111.11111111.11111000(二进制)

注意:非默认子网掩码的1和0也是连续的

3.IPV4地址与默认子网掩码进行按位与操作得到网络地址(对外的IP地址)

提示:不在当前设备的路由器下,就是外面

按位与得到的结果如下

192.168.3.96(十进制)

11000000.10101000.00000011.01100000(十进制)

这里的前三个十网络号,最后一个中的前5位是子网号,后三位是主机号(此主机号被隐藏了,真正的主机号是4)

注意:如果网络地址相同说明在一个子网内

七.子网划分的常见问题

1.选定的子网掩码将创建多少个子网

2 ^ x个,其中x是子网掩码借用的主机位数。如:192.168.10.32/28,其中这个28是网络号位数的意思。我们知道C类ip的默认子网掩码为:255.255.255.0,C类ip的网络号应该是24位,故其借用了主机位4位来充当网络位。这个ip的实际子网掩码是:255.255.255.240,将创建的子网个数就是2 ^ 4=16个

2.每个子网可包含多少台主机

2 ^ y个,其中y是没被借用的主机位的位数。-2是因为,主机位全为0的部分是这个子网的网关,全为1的部分是这个子网的广播地址

3.有哪些子网

算出子网的步长(增量)。一个例子是256-248=8,即子网掩码位248是,步长为8。从0开始不断增加,直到到达子网掩码值,中间的结果就是子网,即0、8、16、32

4.子网划分练习题

1、某主机IP地址是210.33.5.68,子网掩码是255.255.255.128。求它的网络地址?

IP地址和子网掩码进行按位与得到网络地址为210.33.5.68

2、某A类网络20.0.0.0的子网掩码为255.224.0.0,请确定可以划分的子网个数,写出每个子网的子网号。

1.子网个数:2^3个=8个(看占用了几位网络号就是2的几次方)

2.每个子网的子网号

(1)算出步长:256-224=32

(2)1> 20.0.0.0~20.31.255.255

​ 2> 20.32.0.0~20.63.255.255

​ 3> 20.64.0.0~20.95.255.255

​ 4> 20.96.0.0~20.127.255.255

​ 5> 20.128.0.0~20.159.255.255

​ 6> 20.160.0.0~20.191.255.255

​ 7> 20.192.0.0~20.223.255.255

​ 8> 20.224.0.0~20.225.255.255

3、给C类网络211.168.10.0划分5个子网,需要几位网络号,子网掩码是多少,每个子网可容纳多少台主机?

1.2^x>=5 x>=3(x是网络号的位数),所以至少需要3位网络号

2.子网掩码为 255.255.255.224(11100000)

3.2^y-2台=30台主机(y是主机号位数)

4、ip地址10.100.12.238,子网掩码:255.255.248.0,可以划分多少个子网?每个子网有几个可用ip地址?写出每个子网的ip地址范围,其中网关和广播地址分别是多少?(写出前3个和后3个即可)

根据ip地址可以判断出它是A类子网,我们知道A类子网的默认子网掩码是255.0.0.0,通过题目中给出的子网掩码我们可以算出被占的主机位有13位,通过分析得出

1.可以划分出2 ^ 13个子网(13是被占的主机号的位数,这些被占的主机号就变为了网络号)

2.每个子网有2 ^11 -2个ip地址(11是没被占的主机号的位数)

3.要求地址范围,我们先求出步长为256-248=8,然后我们写出每个子网的ip地址范围,每个子网的起始ip地址就是网关,末尾ip地址就是广播地址

1> 10.0.0.0~10.0.7.255

2> 10.0.8.0~10.0.15.255

3> 10.0.16.0~10.0.23.255

n-2> 10.255.232.0~10.255.239.255

n-1> 10.255.240.0~10.255.247.255

n> 10.255.248.0~10.255.255.255

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

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

相关文章

completablefuture的使用

CompletableFuture使用详解 【Java异常】Variable used in lambda expression should be final or effectively final CompletableFuture原理与实践-外卖商家端API的异步化 项目描述 项目接口需要从下游多个接口获取数据&#xff0c;并且下游的网络不稳定还会涉及到循环调用…

DC电源模块的模拟电源对比数字电源的优势有哪些?

BOSHIDA DC电源模块的模拟电源对比数字电源的优势有哪些&#xff1f; DC电源模块是一种电子元件&#xff0c;用于将交流电转换为直流电&#xff0c;以供电路板、集成电路等电子设备使用。在直流电源模块中&#xff0c;有模拟电源和数字电源两种类型。 模拟电源是一种传统的电源…

如何使双核心的ESP32开启双核功能同时执行多任务

如何使双核心的ESP32开启双核功能同时执行多任务 简介查看ESP32当前哪一个内核在执行任务双核同时执行任务总结 简介 ESP32-WROOM-32模组内置两个低功耗 Xtensa 32-bit LX6 MCU&#xff0c;两个 CPU 核&#xff08;core 0与core 1&#xff09;可以被单独控制。可以在两个内核上…

PHP数据加密传输和存储问题

PHP数据加密的类型 md5()&#xff0c;sha1()&#xff0c;crypt() 双md5加密加盐

2、Kafka 生产者

3.1 生产者消息发送流程 3.1.1 发送原理 在消息发送的过程中&#xff0c;涉及到了两个线程——main 线程和 Sender 线程。在 main 线程 中创建了一个双端队列 RecordAccumulator。main 线程将消息发送给 RecordAccumulator&#xff0c; Sender 线程不断从 RecordAccumulator 中…

内衣洗衣机有危害吗?迷你洗衣机热销第一名

现在洗内衣内裤也是一件较麻烦的事情了&#xff0c;在清洗过程中还要用热水杀菌&#xff0c;还要确保洗衣液是否有冲洗干净&#xff0c;还要防止细菌的滋生等等&#xff0c;所以入手一款小型的烘洗全套的内衣洗衣机是非常有必要的&#xff0c;专门的内衣洗衣机可以最大程度减少…

vue3 + axios 中断取消接口请求

前言 最近开发过程中&#xff0c;总是遇到想把正在请求的axios接口取消&#xff0c;这种情况有很多应用场景&#xff0c;举几个例子&#xff1a; 弹窗中接口请求返回图片&#xff0c;用于前端展示&#xff0c;接口还没返回数据&#xff0c;此时关闭弹窗&#xff0c;需要中断接…

【神印王座】伊莱克斯现身,龙皓晨获得一传承,圣采儿却惨遭反噬

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析国漫资讯。 神印王座第78集的预告片更新&#xff0c;一个神秘人物伊莱克斯突然现身&#xff0c;他是一个实力强大、统兵能力卓越的统帅&#xff0c;更拥有令人闻风丧胆的亡灵大军。这个传奇人物被誉为永恒之塔的主人&…

Linux下的命令行参数和环境变量

命令行参数 什么是命令行参数 命令行参数是指在执行命令行程序时&#xff0c;给程序传递的额外参数。在Linux终端中&#xff0c;命令行参数通常通过在命令后面添加空格分隔的参数来传递。 Linux下以main函数举例说明 #include<stdio.h>int main(int argc char* argv[])…

svg常用属性及动画效果

文章目录 引言一、什么是svg二、svg有哪些应用场景三、基本使用四、svg常用属性介绍1. viewBox2. preserveAspectRatio3. symbol标签4.transform1. translate2.scale3.rotate4.skewX和skewY 5. matrix6.stroke-dasharray 五、svg动画1. svg属性结合css动画2. animate 标签动画3…

【网络】网络编程套接字(一)

网络编程套接字 一 一、网络编程中的一些基础知识1、认识端口号2、认识TCP协议和UDP协议3、网络字节序 二、socket编程1、sockaddr结构2、简单的UDP网络程序Ⅰ、服务器的创建Ⅱ、运行服务器Ⅲ、关于客户端的绑定问题Ⅳ、启动客户端Ⅴ、本地测试Ⅵ、网络测试 一、网络编程中的一…

20款VS Code实用插件推荐

前言&#xff1a; VS Code是一个轻量级但功能强大的源代码编辑器&#xff0c;轻量级指的是下载下来的VS Code其实就是一个简单的编辑器&#xff0c;强大指的是支持多种语言的环境插件拓展&#xff0c;也正是因为这种支持插件式安装环境开发让VS Code成为了开发语言工具中的霸主…

升级常有,错误不可避免!更新升级时遇到的错误0x800F081F–0x20003如何修复

Windows更新错误0x800F081F–0x20003主要发生在升级Windows 11/10副本时。这是由于在计算机上启用各种与开发人员相关的设置时出现错误造成的。安装程序遇到的错误被表述为以下任一错误: 我们无法安装Windows 11/10。SAFE_OS阶段的安装失败,INSTALL_UPDATES操作期间出现错误:…

解除OU屏蔽(EBS检查无法直接查询解决)

解除OU屏蔽(EBS检查无法直接查询解决) 具有OU屏蔽的例子 SELECT t.org_id, t.* FROM po.po_headers_all t -- 无屏蔽表&#xff0c;在PL/SQL运行有数据 SELECT t.org_id, t.* FROM apps.po_headers t -- 包含OU屏蔽&#xff0c;在PL/SQL中查询无数据多组织屏蔽原理 1. 在…

免费SSL证书与付费SSL证书的区别

SSL&#xff08;安全套接层&#xff09;证书是网站安全性的关键组成部分&#xff0c;用于保护数据的机密性和完整性。当您考虑在您的网站上部署SSL证书时&#xff0c;您将面临一个重要的决策&#xff1a;是选择免费SSL证书还是付费SSL证书&#xff1f;本文将帮助您理解这两者之…

工具篇之Axure RP 10的使用

引言 最近在学习原型图&#xff0c;针对画原型图的工具&#xff0c;反复对比墨刀、Axure、xiaopiu后&#xff0c;最终选择Axure。 接下来&#xff0c;我便从Axure RP 10的下载、安装、中文字体、授权等几个方面&#xff0c;来介绍Axure。 一、背景 Axure是一款强大的原型设计…

【XSS_MSN】基于GCN的web攻击Payload识别与可解释性分析

原文标题&#xff1a;Web Attack Payload Identification and Interpretability Analysis Based on Graph Convolutional Network 原文链接&#xff1a;https://ieeexplore.ieee.org/document/10076547/ 作者单位&#xff1a;四川大学网络安全学院 相似原理论文&#xff1…

Excel拆分单元格怎么操作?学会这4招,工作效率倍涨!

“刚刚在做一份Excel的报表&#xff0c;需要将某些单元格进行拆分&#xff0c;但是我不知道应该如何处理&#xff0c;大家在使用Excel时有什么比较简单的单元格拆分方法吗&#xff1f;” 当我们需要使用Excel处理大量数据或者创建专业报表时&#xff0c;可能需要对单元格进行拆…

【试题011】C语言多个运算符计算例题

1.题目&#xff1a;表达式1!23/45%6(78)9的值是&#xff1f; 2.代码&#xff1a; #include <stdio.h> int main() {//表达式1 !2 3 / 4 5 % 6 (7 8) 9的值printf("%d\n", (1 !2 3 / 4 5 % 6 (7 8) 9));//分析&#xff1a;多个运算符先考虑优先级…