网络编程是应用层中非常重要的一门课,所以它的学习就变得格外的重要。它是基于网络实现跨主机编程,达到局域网内各主机进程间通信。网络是信息传输、接收、共享的虚拟平台,通过它把各个点、面、体的信息联系到一起,从而实现这些资源的共享。IP地址
网关
子网掩码
DNS域名
什么是IP地址
IPV4地址分类
网络二进制:0000 0000 0000 0000 0000 0000 0000 0001 - 0111 1111 1111 1111 1111 1111 1111 1110点分十进制: 0.0.0.1 -- 127.255.255.254网络二进制:1000 0000 0000 0000 0000 0000 0000 0001 - 1011 1111 1111 1111 1111 1111 1111 1110点分十进制: 128.0.0.1 -- 191.255.255.254网络二进制:1100 0000 0000 0000 0000 0000 0000 0001 - 1101 1111 1111 1111 1111 1111 1111 1110网络二进制:1110 0000 0000 0000 0000 0000 0000 0001 - 1110 1111 1111 1111 1111 1111 1111 1110点分十进制: 224.0.0.1 -- 239.255.255.254网关:取值:1-254之间,如果没有指定某个,则随机挑选一个网关的取值是1~254之间,若无指定,则由系统随机挑选用来管理网络DNS域名解析
推断你是使用哪个地方的什么网络,用来解释某个域名的真实地址协议
OSI架构
为什么采用协议
网络帧:类似json,是为了避免系统之间的字节长长度,导致数据混乱。TCP/UDP协议
TCP:发送数据的时候需要链接,数据稳定发送,不易丢包TCP建立连接(三次握手)
这里需要注意几个标识符,分别是:ACK(确认标识),URG(紧急标识),PSH(推标识),FIN(断开标识),SYN(请求标识)。TCP编程
- 建立socket连接 建立socket连接 买手机
1>建立socket连接---创建一个具有网络属性的文件描述符功能: 创建一个具有网络属性的文件描述符 产生socket套接字int socket(int domain, int type, int protocol);参数: domain:地址族: type:协议: protocol:参数生效值 默认为0 --- 代表前两个参数生效返回值:成功返回套接字文件描述符,失败返回-1
测试图片如下
2>绑定IP和端口号 ----- 全课程最长最难部分intbind(int sockfd, conststruct sockaddr *addr,socklen_t addrlen); 功能: 给sockfd绑定IP和端口号 参数: sockfd addr:结构体指针,是需要用来赋值的 addrlen:addr的长度 返回值: 成功返回0 失败返回-1,并设置错误码
该结构体不适用:1>sa_date长度为14字节 IP和端口号合共6个字节因为自带的结构体不合适,所以引入了 struct sockaddr_instruct sockaddr_in{sa_family_t sin_family; //地址族 2个字节uint16_t sin_port; //端口号 2个字节 ---16位struct in_addr sin_addr; //32位IP地址 4个字节char sin_zero; //填充字节 8个字节};16个字节struct in_addr{IPv4地址赋值专用结构体In_addr_t s_addr; //32位IPv4地址};
也可以使用自动获取IP地址的命令,他就是server.sin_addr.s_addr = INADDR_ANY在进行赋值的时候需要注意,因为Linux使用的是小端序,网络使用的是大端序,所以需要对端序进行改变调用,注意使用的时候看好位数的多少,此处是16位,所以使用的是htonsuint32_thtonl(uint32_t hostlong); 针对32位转换 uint16_thtons(uint16_t hostshort); 针对16位转换 uint32_tntohl(uint32_t netlong); uint16_tntohs(uint16_t netshort); 前两个:小端序转大端序 后两个:大端序转小端序这里需要注意,系统并不会直接读取我们输入的IP地址,这个时候就需要一个函数来对其进行转换。in_addr_tinet_addr(constchar *cp); 、功能: 点分十进制转化为网络二进制 参数: cp:点分十进制地址 返回值: 成功返回网络二进制地址 失败返回INADDR_NONE
监听
为了能够更好的测试监听,这个时候就需要写用户端的函数了#include/* See NOTES */#includeintlisten(int sockfd, int backlog);功能: 监听参数: sockfd backlog:允许服务器一瞬间最大连接数返回值: 成功返回0 失败返回-1,并设置错误码//绑定成功之后,就能够进行下一步了,下一步是监听 /* if(listen(sockfd, int 30)) { perror("listen"); exit(-1); } */监听写好之后,下一个就是写等待连接intaccept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); 功能: 阻塞等待客户端连接 参数: sockfd addr:struct sockaddr * --->保存客户端的IP和端口号 addlen:addr的长度 返回值: 成功返回客户端的文件描述符 失败返回-1,并设置错误码