- 📃课程基本信息
- 网络编程
- 📑课程大纲
- 网络编程基础
- 网络模型
每一层都有属于自己的一些通信协议- OSI七层模型
- 应用层 作用:开发特定的应用程序需要其中的部分协议 http协议(超文本传输协议)ftp(文件传输协议)telnet(远程登录)
- 会话层 作用:建立会话,对数据加密,解密
- 表示层 作用:数据的封装,解析
- 传输层 作用:解决数据载网络中传输的问题 tcp协议和udp协议
- 网络层(ip层) 作用:解决路由(数据采用何种路径发送出去最优)问题 ip协议
- 数据链路层 作用:开发网卡的驱动,需要深入了解这个层次的协议
- 物理层 作用:网络接口,真实的网卡
- TCP/IP模型(把七层协议合并简化成四层)
- 应用层(原来的应用层,会话层,表示层合并)
- 传输层
- 网际层
- 网络接口层(数据链路层和物理层合并)
- OSI七层模型
- 传输层协议
- tcp tcp的通信流程
- tcp的单向通信
- tcp的双向通信
- tcp的广播
- udp udp的通信流程
- udp的单向,双向通信
- udp广播
- udp组
- tcp tcp的通信流程
- ipv4和ipv6
- ipv4:32位的ip地址,用三个小数点吧ip划分位四个部分,每个部分各占一个字节(0-255之间),点分十进制ip
- ipv6:128位的ip地址,解决ipv4不够用的问题
- 地址结构体
- 地址结构体
- 通用地址结构体 struct sockaddr { uint8_t sa_len;
- unsigned short sa_family; /* 地址家族, AF_xxx */
- char sa_data[14]; /*14字节协议地址*/ };
- ipv4地址结构体
- struct sockaddr_in {
- uint8_t sa_len; /* 结构体长度*/
- short int sin_family; /* 通信类型 */
- unsigned short int sin_port; /* 端口 */
- struct in_addr 或sin_addr; /* Internet 地址 */
- unsigned char sin_zero[8]; /* 未使用的*/
- };
- 存放ipv4的ip地址结构体
- struct in_addr { //sin_addr的结构体类型in_addr 原型
- unsigned long s_addr; /*存4字节的 IP 地址(使用网络字节顺序)。*/
- };
- ipv6地址结构体
- struct sockaddr_in6 {
- sa_family_t sin6_family; /* AF_INET6 */
- in_port_t sin6_port; /* Transport layer port # */
- uint32_t sin6_flowinfo; /* IPv6 flow information */
- struct in6_addr sin6_addr; /* IPv6 address */
- uint32_t sin6_scope_id; /* IPv6 scope-id */
- };
- 存放ipv6的ip地址结构体
- struct in6_addr {
- union {
- uint8_t u6_addr8[16];
- uint16_t u6_addr16[8];
- uint32_t u6_addr32[4];
- } in6_u;
- #define s6_addr in6_u.u6_addr8
- #define s6_addr16 in6_u.u6_addr16
- #define s6_addr32 in6_u.u6_addr32
- };
- 使用图示
-
- 地址结构体
- 网络模型
- 🖍网络编程函数
- socket
- 函数原型
- int socket(int domain,int type,int protocol)
- 作用
- 创建套接字
- 头文件
- <sys/socket.h>
- 参数
- domain(地址协议类型)
- AF_INET或者PF_INET (ipv4地址协议)
- AF_INET6或者PF_INET6(ipv6地址协议)
- type (套接字类型)
- SOCK_STREAM (tcp套接字,流式套接字,数据流套接字)
- SOCK_DGRAM (udp套接字,数据报套接字)
- protocal (拓展协议)
- 一般设置为0
- domain(地址协议类型)
- 返回值
- 成功:返回套接字的文件描述符
- 失败: 返回-1
- 函数原型
- setsockopt
- 函数原型
- int setsockopt(int sockfd , int level, int optname, void *optval, socklen_t *optlen);
- 作用
- 设置套接字描述符的属性
- 头文件
- <sys/socket.h>
- <sys/type.h>
- 参数
- sockfd:要设置的套接字描述符
- level:选项定义的层次。或为特定协议的代码(如IPv4,IPv6,TCP,SCTP),或为通用套接字代码(SOL_SOCKET)。
- optname:选项名。level对应的选项,一个level对应多个选项,不同选项对应不同功能。
- optval:指向某个变量的指针,该变量是要设置新值的缓冲区。可以是一个结构体,也可以是普通变量
- optlen:optval的长度。
- 返回值
- 成功:返回0
- 失败: 返回-1
- 函数原型
- bind
- 函数原型
- int bind(int sockfd, const struct sockaddr *my_addr, socklen_t addrlen);
- 作用
- 绑定ip和端口号
- 头文件
- <sys/types.h>
- <sys/socket.h>
- 参数
- socked:套接字的文件描述符
- my_addr:指向一个结构为sockaddr参数的指针
- addrlen:my_addr结构体的长度
- 返回值
- 成功:返回0
- 失败: 返回-1
- 函数原型
- 大小端转换
大端序:数据的高字节存放到低地址,低字节存放到高地址
小端序:数据的高字节存放到高地址,低字节存放到低地址
ubuntu:存储数据的时候统一采用小端序
计算机网络传输数据:采用大端序
需要把ip和端口号从小端存储转换成计算机网络需要的大端存储
accept成功之后打印客户端的ip和端口需要把大端序转换成小端序- inet_addr(适用于ipv4)
小端序ip转换成大端序ip- 函数原型
- in_addr_t inet_addr(const char *cp);
- 作用
- 将一个点间隔地址转换成一个in_addr
- 头文件
- <sys/socket.h>
- <netinet/in.h>
- <arpa/inet.h>
- 参数
- cp为字符串格式的ip地址
- 返回值
- 成功:返回转换得到的大端序ip地址
- 失败: 返回-1
- 函数原型
- htons
- 函数原型
- uint16_t htons(uint16_t hostshort);
- 作用
- 小端序端口转换成大端序端口
- 头文件
- <arpa/inet.h>
- 参数
- hostshort为小端序端口号
- 返回值
- 成功:返回转换得到的大端序端口号
- 失败: 返回-1
- 函数原型
- inet_ntoa(适用于ipv4)
将网络地址转换成“.”点隔的字符串格式- 函数原型
- char *inet_ntoa(struct in_addr in);
- 作用
- 大端序ip转成小端序ip
- 头文件
- <sys/socket.h>
- <netinet/in.h>
- <arpa/inet.h>
- 参数
- in :大端序的ip
- 返回值
- 成功:返回转换得到的小端序字符串ip
- 失败: 返回-1
- 函数原型
- inet_addr(适用于ipv4)
- connect
- 函数原型
- int connect(int socket, const struct sockaddr *address,socklen_t address_len);
- 作用
- 建立网络连接
- 头文件
- <sys/types.h>
- <sys/socket.h>
- 参数
- sockfd:该参数是通过调用socket()函数来获得socket的文件描述符并传入该位置。
- address是一个指向一个结构体为sockaddr参数的指针,结构体包含要连接的端口的信息
- address_len是address结构体的长度
- 返回值
- 成功:返回0
- 失败: 返回-1
- 函数原型
- listen
listen函数使用主动连接套接字变为被连接套接口,使得一个进程可以接受其它进程的请求,从而成为一个服务器进程。在TCP服务器编程中listen函数把进程变为一个服务器,并指定相应的套接字变为被动连接。- 函数原型
- int listen(int sockfd, int backlog);
- 作用
- 监听连接,是否有其他客户端接入
- 头文件
- <sys/types.h>
- <sys/socket.h>
- 参数
- sockfd:一个已绑定未被连接的套接字描述符
- backlog: 规定了内核应该为相应套接字排队的最大连接个数。用SOMAXCONN则为系统给出的最大值
- 返回值
- 成功:返回0
- 失败: 返回-1
- 函数原型
- accept
- 函数原型
- int accept(int socket , struct sockaddr *restrict address, socklen_t *restrict address lenth)
- 作用
- 与发送连接请求的客户端连接
- 头文件
- <sys/types.h>
- <sys/socket.h>
- 参数
- 参数socket为套接字的描述符
- 参数address,存放连接成功那个客户端的ip地址和端口号
- 参数lenth 接受客户端ip地址和端口号结构体的结构长度
- 返回值
- 成功:返回包含客户端信息的新套接字socket
- 失败: 返回-1
- 注意
- 有多少个客户端连接就需要调用accept多少次
- 函数原型
- send
- 函数原型
- ssize_t send(int sockfd, const void *buf, size_t len, int flags);
- 作用
- 发送信息到一个套接字中
- 头文件
- <sys/socket.h>
- 参数
- 参数sockfd:接收消息的套接字的文件描述符。
- 参数buf:存放着要发送的消息
- 参数len:要发送的字节数。
- 参数flags:默认设置0
- 返回值
- 成功:返回发送的字节数
- 失败: 返回-1
- 函数原型
- recv
- 函数原型
- int recv( socket s, char *buf, int len, int flags );
- 作用
- 从一个套接字中接受信息
- 头文件
- <sys/socket.h>
- 参数
- 参数s 是接收端套接字描述符;
- 参数buf 是一个缓冲区,该缓冲区用来存放recv函数接收到的数据;
- 参数len 是buf的长度;
- 参数flags 一般置0
- 返回值
- 成功:返回接收的数据字节数
- 失败: 返回-1
- 注意
- 若recv函数在等待协议接受数据时网络中断了,那么它会返回0
- 函数原型
- socket
- 网络编程基础
如有错误,欢迎指出