一、 网络结构模式
二、 MAC地址、IP地址、端口
网卡有两种:以太网卡和无线网卡
ip+端口:ip是为了让电脑a找到电脑b,端口是为了让电脑a中的qq给电脑b中的qq发送信息,而不是发送给电脑b中的微信。
利用端口号找到某个进程并与之通信
三、 网络模型
四、 协议
五、 网络通信的过程
六、 socket介绍
7 字节序
/*
字节序:字节在内存中存储的顺序。
小端字节序:数据的高位字节存储在内存的高位地址,低位字节存储在内存的低位地址
大端字节序:数据的低位字节存储在内存的高位地址,高位字节存储在内存的低位地址
*/
// 通过代码检测当前主机的字节序
#include<stdio.h>
int main(){
union{
short value; //2字节
char bytes[sizeof(short)]; // char[2]
}test;
test.value = 0x0102;
if((test.bytes[0] == 1) && (test.bytes[1] == 2)){
//高位字节存储在内存地位地址
printf("大端字节序\n");
}else if( (test.bytes[0] == 2) && (test.bytes[1] == 1)){
//高位字节存储在内存的高位地址
printf("小端字节序\n");
}else {
printf("未知错误\n");
}
return 0;
}
8 字节序转换函数
/*
网络通信时,需要将主机字节序转换成网络字节序(大端),
另外一段获取到数据以后根据情况将网络字节序转换成主机字节序。
// 转换端口
uint16_t htons(uint16_t hostshort); // 主机字节序 - 网络字节序
uint16_t ntohs(uint16_t netshort); // 主机字节序 - 网络字节序
// 转IP
uint32_t htonl(uint32_t hostlong); // 主机字节序 - 网络字节序
uint32_t ntohl(uint32_t netlong); // 主机字节序 - 网络字节序
*/
#include<stdio.h>
#include<arpa/inet.h>
int main(){
// htons 转换端口uint16_t
// 一般情况网络通信没有负数,所以一般使用unsigned无符号的整数
unsigned short a = 0x0102;
printf("a : %x\n",a);
unsigned short b = htons(a);
//以16进制来打印
printf("b : %x\n",b);
printf("====================\n");
// htonl 转换ip uint32_t
char buf[4] = {192,168,1,24};
int num = *(int *)buf; //变成了int型的指针
unsigned int sum = htonl(num);
unsigned char *p = (char *)∑ //char 一个字节
printf("%d,%d,%d,%d\n",*p,*(p+1),*(p+2),*(p+3));
printf("====================\n");
// ntohs
unsigned short c = 0x0302;
printf("c : %x\n",c);
unsigned short d = ntohs(c);
printf("d : %x\n",d);
printf("====================\n");
//ntohl
char buf1[4] = {100,2,168,192};
int num1 = *(int *)buf1;
unsigned int sum1 = ntohl(num1);
unsigned char *p1 = (char *)&sum1;
printf("%d,%d,%d,%d \n",*p1,*(p1+1),*(p1+2),*(p1+3));
return 0;
}