#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;
}
范围:1.0.0.0~127.255.255.255(1的二进制是0000 0001)
作用:大量主机,公网
公网的好处:无论在什么地方访问公网中的服务器,IP地址都不发生改变
范围:128.0.0.0~191.255.255.255(128的二进制是1000 0000)
作用:国际大公司,政府
范围:192.0.0.0~223.255.255.255(192的二进制是1100 0000)
作用:小公司,校园网,科研公司
范围:240.0.0.0~239.255.255.255(224的二进制是1110 0000)
作用:组播
范围:240.0.0.0~255.255.255.255(240的二进制是1111 0000)
作用:保留
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政府预留
172.16.0.0~172.31.255.255
192.168.0.0~192.168.255.25
为了方便管理,把一个大的网络,分成小的网络就叫子网
子网掩码又叫网络掩码,地址掩码,子网络遮罩,就是说把自网络遮起来了,不让外界窥探到
注意:我们在设置IP地址时,一定要设置子网掩码,否则无法设置IP地址
192.168.3.100(十进制)
11000000.10101000.00000011.01100100(二进制)
255.255.255.0(十进制)
11111111.11111111.11111111.00000000(二进制)
注意:子网掩码的1和0都是连续的
提示:不在当前设备的路由器下,就是外面
按位与得到的结果如下
192.168.3.0(十进制)
11000000.10101000.00000011.00000000(十进制)
这里的前三个十网络号,最后一个是主机号(此主机号被隐藏了,真正的主机号是100(十进制),01100100(二进制))
注意:1.网络地址中非零的是网络号,为零的是主机号
2.如果网络地址相同说明在一个子网内
默认的子网掩码为
255.0.0.0(十进制)
11111111.00000000.00000000.00000000(二进制)
默认的子网掩码为
255.255.0.0(十进制)
11111111.11111111.00000000.00000000(二进制)
默认的子网掩码为
255.255.0.0(十进制)
11111111.11111111.11111111.00000000(二进制)
网关又称网间连接器,协议转换器。网间连接器,就是连接两个子网之间的设备或软件,如下图
注意:网关都是具有路由功能的IP地址,就是说网关必须要有路由功能,默认的主机号都是0,这样才是网关。比如说网络A的网关IP地址就应该是192.18.1.0,网络B的网关地址就应该是192.18.2.0
用于向网络中的所有的设备进行广播
具有正常的网络号部分,而主机号部分全为1的IP地址称之为直接广播地址
发送直接广播地址数据,会将数据发送给指定的子网内的所有主机
指的是32位全为1(即255.255.255.255)的IP地址,用于本网广播
发送有限广播地址数据,只能将数据发送给本网网络中的所有主机
我们将上面客户端传输数据的方式从单播变为直接广播/间接广播,并且让客户端只能发送数据
//创建一个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");
//创建一个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));
非默认子网掩码一定比默认子网掩码长
192.168.3.100(十进制)
11000000.10101000.00000011.01100100(二进制)
255.255.255.248(十进制)
11111111.11111111.11111111.11111000(二进制)
注意:非默认子网掩码的1和0也是连续的
提示:不在当前设备的路由器下,就是外面
按位与得到的结果如下
192.168.3.96(十进制)
11000000.10101000.00000011.01100000(十进制)
这里的前三个十网络号,最后一个中的前5位是子网号,后三位是主机号(此主机号被隐藏了,真正的主机号是4)
注意:如果网络地址相同说明在一个子网内
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 ^ y个,其中y是没被借用的主机位的位数。-2是因为,主机位全为0的部分是这个子网的网关,全为1的部分是这个子网的广播地址
算出子网的步长(增量)。一个例子是256-248=8,即子网掩码位248是,步长为8。从0开始不断增加,直到到达子网掩码值,中间的结果就是子网,即0、8、16、32
IP地址和子网掩码进行按位与得到网络地址为210.33.5.68
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
1.2^x>=5 x>=3(x是网络号的位数),所以至少需要3位网络号
2.子网掩码为 255.255.255.224(11100000)
3.2^y-2台=30台主机(y是主机号位数)
根据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