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

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

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

创建一个客户端

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

在这里插入图片描述

2在该项目下创建一个文件,在该文件中进行客户端代码的实现如下
#include
#include
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.什么是网关

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

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

你可能感兴趣的:(计算机网络,c语言)