• 网络通信(套接字通信)(C/C++)


    1.网络编程必知概念

    1.广域网和局域网

            广域网:又称外网、公网。是连接不同地区局域网或城域网进行计算机通信的远程公共网络。

            局域网:在一定的通信范围内,有很个多计算机组成的私有网络就叫局域网。(这些计算机相互之间是可以通信的,但是不能直接访问外网(可以通过网线或代理服务器就可以访问外网))

    2.互联网协议地址(IP)

           IP互联网协议地址(Internet Protocol):本质是一个整型数,用于表示计算机在网络中的地址。IP协议版本有两个:IPv4和IPv6

    IPv4(Internet Protocol version4):

    • 使用一个32位的整型数描述一个IP地址,4个字节,int型
    • 也可以使用一个点分十进制字符串描述这个IP地址: 192.168.247.135
    • 分成了4份,每份1字节,8bit(char),最大值为 255
      • 0.0.0.0 是最小的IP地址
      • 255.255.255.255是最大的IP地址
    • 按照IPv4协议计算,可以使用的IP地址共有 2^{32}

    IPv6(Internet Protocol version6):

    • 使用一个128位的整型数描述一个IP地址,16个字节

    • 也可以使用一个字符串描述这个IP地址:2001:0db8:3c4d:0015:0000:0000:1a2f:1a2b

    • 分成了8份,每份2字节,每一部分以16进制的方式表示

    • 按照IPv6协议计算,可以使用的IP地址共有 2^{128}

    3.在不同系统上查看主机对应的ip地址命令

    在windows上查看ip的命令:ipconfig

    在Linux上查看ip的命令:ifconfig

    ping www.baidu.com    # 测试是否可用连接外网

    ping 局域网ip地址        # 测试是否可用连接局域网

    4.端口(port)

    端口的作用是定位到主机上的某一个进程,通过这个端口进程就可以接收到对应的网络数据了

    比如: 在电脑上运行了微信和QQ, 小明通过客户端给我的的微信发消息, 电脑上的微信就收到了消息, 为什么?

    • 运行在电脑上的微信和QQ都绑定了不同的端口
    • 通过IP地址可以定位到某一台主机,通过端口就可以定位到主机上的某一个进程
    • 通过指定的IP和端口,发送数据的时候对应的端口就能接收到数据了

    注意:通过IP地址可以找到一个主机, 通过端口port定位到某一个进程

    5.OSI/ISO网络分层模型

    应用层

    http ftp KCP MQTT Modbus(各种协议)

    表示层

    数据加解密

    会话层

    进程管理

    传输层

    端到端 端口指向具体进程 UDP / TCP

    网络层

    统一为上层提供同样的身份信息 IP地址

    数据链路层 ​​​​​​​

    数据的错误检错 规定身份信息(不同的网络拓扑结构身份信息就不同)
    物理层 电气规范

     6.常用网络通信协议

    • TCP协议->传输层协议
    • UDP协议->传输层协议
    • IP协议->网络层协议
    • 以太网协议->网络接口层协议

    7.socket编程

            socket套接字:一种通用的网络编程接口。

            socket 本身是一种进程间通信的方式,最开始可以作为本地的进程之间数据的传输方式。在本地可以通过进程 PID 来唯一标识一个进程,但是在网络中这是行不通的。

            而非本地的进程,该怎么标识自己那,就是前面我们说的 IP 地址和端口号了。

    8.字节序

            字节序,顾名思义字节的顺序,就是大于一个字节类型的数据在内存中的存放顺序,也就是说对于单字符来说是没有字节序问题的,字符串是单字符的集合,因此字符串也没有字节序问题。

            数据在计算机主要有两种存储方式大端和小端。

    Little-Endian -> 主机字节序 (小端)

    • 数据的低位字节存储到内存的低地址位, 数据的高位字节存储到内存的高地址位;
    • 我们使用的PC机,数据的存储默认使用的是小端。

    Big-Endian -> 网络字节序 (大端)

    • 数据据的低位字节存储到内存的高地址位, 数据的高位字节存储到内存的低地址位;
    • 套接字通信过程中操作的数据都是大端存储的,包括:接收/发送的数据、IP地址、端口。

    9.字节序转换函数

    #include
    // u:unsigned
    // 16: 16位, 32:32位
    // h: host, 主机字节序
    // n: net, 网络字节序
    // s: short
    // l: int

    // 这套api主要用于 网络通信过程中 IP 和 端口 的 转换
    // 将一个短整型从主机字节序 -> 网络字节序
    uint16_t htons(uint16_t hostshort);    
    // 将一个整型从主机字节序 -> 网络字节序
    uint32_t htonl(uint32_t hostlong);    

    // 将一个短整型从网络字节序 -> 主机字节序
    uint16_t ntohs(uint16_t netshort)
    // 将一个整型从网络字节序 -> 主机字节序
    uint32_t ntohl(uint32_t netlong);

    10.IP地址转换函数

    // 主机字节序的IP地址转换为网络字节序
    // 主机字节序的IP地址是字符串, 网络字节序IP地址是整形
    int inet_pton(int af, const char *src, void *dst); 

    参数:
            af: 地址族(IP地址的家族包括ipv4和ipv6)协议
                    AF_INET: ipv4格式的ip地址
                    AF_INET6: ipv6格式的ip地址
            src: 传入参数, 对应要转换的点分十进制的ip地址: 192.168.1.100
            dst: 传出参数, 函数调用完成, 转换得到的大端整型IP被写入到这块内存中
    返回值:

            成功返回1

            失败返回0或者-1

    #include
    // 将大端的整型数, 转换为小端的点分十进制的IP地址        
    const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);

    参数:

            af: 地址族协议
                    AF_INET: ipv4格式的ip地址
                    AF_INET6: ipv6格式的ip地址
            src: 传入参数, 这个指针指向的内存中存储了大端的整型IP地址
            dst: 传出参数, 存储转换得到的小端的点分十进制的IP地址
            size: 修饰dst参数的, 标记dst指向的内存中最多可以存储多少个字节
    返回值:

            成功: 指针指向第三个参数对应的内存地址, 通过返回值也可以直接取出转换得到的IP字符串
            失败: NULL

    以下两个函数:只能转换ipv4格式的ip地址 

    // 点分十进制IP -> 大端整型
    in_addr_t inet_addr (const char *cp);

    // 大端整型 -> 点分十进制IP
    char* inet_ntoa(struct in_addr in);

     2.UDP通信流程

    udp是一个无连接的,不可靠的,用户数据报协议,这个协议是一个传输层协议

    • 无连接:它仅仅将要发送的数据报传送至网络,并接收从网上传来的数据报,而不与远端的UDP模块建立连接。
    • 不可靠:UDP只提供数据的不可靠交付,它一旦把应用程序发给网络层的数据发送出去,就不保留数据备份(所以UDP有时候也被认为是不可靠的数据报协议)
    • 用户数据报:用户数据报协议将应用程序产生的数据消息转化成数据包,然后经由IP发送,但它并不验证消息是否被正确发送

    UDP通信流程图:

    3.TC

  • 相关阅读:
    池州控股集团财务共享项目启动啦!
    论文精读ResNet: Deep Residual Learning for Image Recognition
    专车数据层架构进化往事:好的架构是进化来的,不是设计来的
    大数据爬虫分析基于Python+Django旅游大数据分析系统
    docker系列(8) - docker网络
    年终固定资产盘点如何快速准确?
    【数字IC验证快速入门】3、数字IC设计全流程介绍
    开源项目-排班管理系统,考勤管理系统
    MyBatisPlus(十四)主键策略
    [操作系统笔记]两级页表
  • 原文地址:https://blog.csdn.net/weixin_44954230/article/details/133277065