Linux 网络编程

  • 📃课程基本信息
    • 网络编程
  • 📑课程大纲
    • 网络编程基础
      • 网络模型
        每一层都有属于自己的一些通信协议
        • OSI七层模型
          • 应用层 作用:开发特定的应用程序需要其中的部分协议 http协议(超文本传输协议)ftp(文件传输协议)telnet(远程登录)
          • 会话层 作用:建立会话,对数据加密,解密
          • 表示层 作用:数据的封装,解析
          • 传输层 作用:解决数据载网络中传输的问题 tcp协议和udp协议
          • 网络层(ip层) 作用:解决路由(数据采用何种路径发送出去最优)问题 ip协议
          • 数据链路层 作用:开发网卡的驱动,需要深入了解这个层次的协议
          • 物理层 作用:网络接口,真实的网卡
        • TCP/IP模型(把七层协议合并简化成四层)
          • 应用层(原来的应用层,会话层,表示层合并)
          • 传输层
          • 网际层
          • 网络接口层(数据链路层和物理层合并)
      • 传输层协议
        • tcp tcp的通信流程
          • tcp的单向通信
          • tcp的双向通信
          • tcp的广播
        • udp udp的通信流程
          • udp的单向,双向通信
          • udp广播
          • udp组
      • 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
        • 返回值
          • 成功:返回套接字的文件描述符
          • 失败: 返回-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
      • 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

 如有错误,欢迎指出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值