• Linux 网络编程 TCP/UDP编程


      在TCP/IP协议族中,有很多种协议。TCP/IP协议群中的核心协议被设计运行在网络层和传输层,它们为网络中的各主机提供通信服务,也为模型的最高层–应用层中的协议提供服务。其中的TCP和UDP协议就是应用在传输层的协议。

    IP地址

    1. IP地址的作用
      IP地址用来标识网络中的一台主机。
    本篇文章主要讨论基于IPV4协议的网络通信。
    2. IP地址的格式转换
      IP地址有两种格式:十进制点分形式和32为二进制形式。前者=是大众所熟悉的形式,后者是网络传输中IP地址的存储方式。
    十进制点分形式 “192.168.1.1”
    32位二进制形式 10111110 10101000 00000001 00000001
    IPv4地址转换函数: inet_aton(); inet_addr(); inet_ntoa();

    #include 
    #include 
    #include 
    char *inet_ntoa(struct in_addr address);//返回点分十进制形式
    
    in_addr_t inet_addr(const char *cp);//返回二进制地址形式
    参数:
    	cp	点分十进制IP地址字符串
    返回值:
    	成功返回 转换后的二进制地址形式
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    端口

    • 端口号是一个无符号短整型,取值范围0-65535;
    • 端口号是一种系统资源,一般0-1023被系统程序所使用
    • TCP端口号和UDP端口号独立,互不影响
        端口号可以用来代表主机内部的某个套接字。换句话说,当一个套接字建立好,需要和某个IP和端口号进行绑定,这样双方才能实现端到端的通信。
    • 字节序是指计算机中多字节整形数据的存储方式。
    • 字节序有两种:大端序和小端序。
      字节序转换函数: htons(); ntohs(); htonl(); ntohl();
    h:	主机host
    to: 转换
    s:	short类型
    l:	long类型
    n:	network网络
    
    #include 
    uint32_t htonl(uint32_t hostlong);
    uint16_t htons(uint16_t hostshort);
    uint32_t ntohl(uint32_t netlong);
    uint16_t ntohs(uint16_t netshort);
    参数:
    	hostshort	主机字节序的 16bit数据
    	hostlong	主机字节序的 32bit数据
    	netshort	网络字节序的 16bit数据
    	netlong		网络字节序的 32bit数据
    返回值:
    	成功返回 转换后的字节序值,失败返回 -1
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    地址相关的数据结构

    /* 通常地址结构 */
    struct sockaddr {
    	unsigned short sa_family; //地址族 AF_XXX
    	char sa_data[14];	//14字节的协议地址
    }
    
    /* Internet协议地址结构 */
    struct sockaddr_in
    {
    short int sin_family; //地址族 2bytes
    unsigned short int sin_port;	//端口号 2bytes
    struct in_addr sin_addr; //IPv4地址 4bytes
    unsigned char sin_zero[8]; //填充0 以保持与struct sockaddr同样大小 8bytes
    }
    
    /* IPv4地址结构 */
    struct in_addr {
    	u_int32_t s_addr; /* 按网络字节次序(大端序)的地址 */
    };
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    TCP

    概述

      TCP,传输控制协议,是一种面向连接的传输层协议,向应用层提供可靠的面向连接的数据流传输服务。它能提供高可靠性通信(数据无误、数据无丢失、数据无失序、数据无重复到达)。
    在这里插入图片描述

    TCP编程
    TCP服务器和客户端流程

    在这里插入图片描述

    相关函数接口

    创建套接字:

    #include            /* See NOTES */
    #include 
    int socket(int domain, int type,  int  protocol);
    参数:
     domain:选择协议族
     	AF_UNIX      UNIX域协议:本地通信
     	AF_LOCAL     同AF_UNIX
         AF_INET      IPv4协议
     	AF_INET6     IPv6协议
     	AF_ROUTE	 路由套接字
         AF_KEY       密钥管理协议,密钥套接字
    
     type:选择套接字类型
     	SOCK_STREAM	流式套接字
     	SOCK_DGRAM	数据包datagram套接字
     	SOCK_RAW	原始套接字
     
     protocol:
     	0 (原始套接字除外)
    返回值:
     	成功返回 套接字描述符,失败返回 -1
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    绑定套接字:

    /* bind 函数原型 */
    #include 
    #include 
    int bind(int sockfd, struct sockaddr  *my_addr,  socklen_t addrlen);
    参数:
    	sockfd		套接字描述符
    	my_addr		绑定客户端地址:不同协议族结构体定义不同,传参时需要强转为通用结构体
    	addrlen		客户端地址信息长度
    
    返回值:
    	成功返回 0,失败返回 -1
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    监听:

    #include 
    int listen(int sockfd, int backlog);
    参数:
     	sockfd:	套接字描述符
     	backlog:能够同时监听的客户端个数(不是同时能连接的个数)
    返回值:
     	成功返回 0,错误返回 -1
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    接收客户端连接请求:

    #include 
    #include 
    int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
    参数:
     	sockfd	socket返回的监听套接字描述符
     	addr	用于保存客户端地址信息,若不需要填NULL
    	addrlen	客户端地址信息长度,若不需要填NULL
    返回值:
     	错误返回 -1,正确返回 用于通信的套接字;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    客户端向服务器请求连接:

    #include           /* See NOTES */
    #include 
    int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
    参数:
     	sockfd	套接字描述符
     	addr	服务器端地址
     	addrlen	地址长度
    返回值:
     	成功返回 0,失败返回 -1
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    发送数据:

    #include 
    #include 
    int send(int sockfd, const void *msg, size_t len, int flags);
    参数:
     	sockfd	套接字描述符
     	msg		发送缓冲区的地址
     	len		发送数据的长度
     	flags	一般为 0
    返回值:
     	成功返回 实际发送的字节数,失败返回 -1
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    接收数据:

    #include 
    #include 
    ssize_t recv(int sockfd, void *buf, size_t len, int flags);
    参数:
     	sockfd	套接字描述符
     	buf		存放接收数据的缓冲区
     	len		接收数据的长度
     	flags	一般为0
    返回值:
     	成功返回 实际收到的字节数,失败返回 -1
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    UDP

    概述

      UDP,用户数据报协议,是一种面向无连接的不可靠传输层协议。具有资源消耗小,处理速度快的特点。
      由于UDP通信之前不需要先建立一个连接,因此UDP应用要比TCP应用更加简单,高效,也能更好的解决实时性问题。
    在这里插入图片描述

    UDP编程
    UDP服务器和客户端流程

    UDP服务器流程:

    • socket();
    • bind();
    • recvfrom(); / sendto();
    • close();

    UDP客户端流程

    • socket();
    • recvfrom(); / sendto();
    • close();
    相关函数接口

    一些函数同上,介绍两个一般用于UDP接收发送的函数,也可用于TCP。
    接收数据:

    #include 
    #include 
    ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
    
    参数:
        sockfd		socket函数的返回值,套接字描述符
        buf			接收数据的缓冲区地址
        len			接收数据的大小
        flags		一般为 0
        src_addr	发送端的结构体的地址	
        addrlen		发送端的结构体长度的地址
    
    返回值:
        成功返回接收的字节数,失败返回 -1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    发送数据:

    #include 
    #include 
    ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
    参数:
        sockfd		socket函数的返回值,套接字描述符
        buf			发送数据的缓冲区
        len			发送数据的大小
        flags		一般为 0
        dest_addr	接收端的结构体的地址
        addrlen		接收端的结构体长度的地址
    返回值:
    	成功返回发送的字节数,失败返回 -1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
  • 相关阅读:
    助力AR眼镜轻量化,国内攻破二维扩瞳几何光波导量产
    spring整合struts2
    select/poll/epoll
    评价——模糊综合评价
    Zabbix监控硬盘S.M.A.R.T.信息教程
    mysql数据库安装
    Notion的安装与使用
    UE4 基础篇十四:自定义插件
    lombok插件浅析
    蓝桥杯刷题-约数的个数
  • 原文地址:https://blog.csdn.net/weixin_45649201/article/details/126392509