计网----使用代码实现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