zoukankan      html  css  js  c++  java
  • C++中实现TCP/UDP网络编程的流程和主要函数使用方法说明

    socket通讯

    网络字节序

    • 小端法: 高位存高地址,低位存低地址。 (intel架构的存储方式)
    • 大端法:高位存低地址,低位存高地址。(网络传输的方式)
    #include <arpa/inet.h>
    
    // 将本地转网络,转IP  转192.168.1.11->string->atoi->int->htonl->网络字节序,可以使用 int inet_pton(); 进行直接转换
    uint32_t  htonl(uint32_t hostlong); 
    // 本地转网络,转port
    uint16_t  htons(uint16_t hostshort);
    // 网络转本地,转ip
    uint32_t ntohl(uint32_t netlong);
    // 网络转本地,转port
    uint16_t ntohs(uint16_t netshort);
    
    // string转网络字节
    int inet_pton(int af, const char * restrict src, void * restrict dst);
    // af: AF_INET, AF_INET6
    // src: ip地址,点分十进制
    // dst: 转换之后的 网络字节序的地址
    

    创建socket服务器的步骤

    1. 创建socket句柄
    2. bind() 绑定ip+port
    3. listen() 设置监听上线,同时连接数
    4. accept() 阻塞监听客户端连接
    5. read() 进行数据的读取,读取到的数据需要toupper()进行小写转大写
    6. write() 写入,写给客户端返回值
    7. 当read()读到0就是close的时候进行 close() 关闭

    Socket函数分析

    创建一个套接字

    int socket(int domain, int type, int protocol);

    • domain : 所选用的ip地址协议, AF_INET, AF_INET6
    • type : 类型 SOCK_STREAM(TCP/流形式), SOCK_DGRAM(UDP/报形式)
    • protocol : 代表协议号 0

    返回值:

    • 成功返回0,新套接字的文件描述

    • 失败返回: -1

    #include <sys/socket.h>
    
    fd = socket(AF_INET, SOCK_STREAM, 0)
    

    sockaddr地址结构体分析

    #include <sys/socket.h>
    #include <arpa/inet.h>
    
    struct sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_port = htons(9527);
    int dst;
    inet_pton(AF_INET, "192.168.22.45", (void *)&dst);
    addr.sin_addr.s_addr = dst;
    addr.sin_addr.s_addr = htonl(INADDR_ANY) // INADDR_ANY 取出系统有效的任意ip地址,是二进制类型
    bind(fd, (struct sockaddr *)&addr, size);
    

    bind函数的分析

    绑定函数

    bind(fd, (struct sockaddr *)&addr, size);

    • fd : socket文件对象
    • (struct sockaddr *)&addr : 将sockaddr存储的地址结构进行强制转换成sockaddr 进行传入
    • size : addr的大小,使用sizeof进行获取

    listen函数分析

    监听函数

    int listen(int sockfd, int backlog);

    • sockfd : 套接字
    • backlog : 最大连接数,最大为128
    • 返回值: 0, -1 error

    accept函数分析

    堵塞函数

    int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

    • sockfd : socket 函数返回值
    • addr : 传出参数, 成功返回服务器的ip和端口号
    • addrlen : 传入传出。入: addr的大小。 出:客户端addr的实际大小

    返回值:

    • 成功: 大于0,返回成功的套接字文件描述符
    • 失败:返回-1

    connect函数分析

    int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen); 使用现有的socket与服务器建立连接

    • sockfd: socket 函数返回值
    • addr: 传入服务器的地址结构
    • 返回值:
      • 成功:0
      • 失败:-1
  • 相关阅读:
    Maven学习总结(九)——使用Nexus搭建Maven私服
    Maven学习总结(八)——使用Maven构建多模块项目
    Maven学习总结(七)——eclipse中使用Maven创建Web项目
    Maven学习总结(六)——Maven与Eclipse整合
    Maven学习总结(五)——聚合与继承
    Maven学习总结(四)——Maven核心概念
    剑指offer【12】- 二进制中1的个数
    剑指offer【11】- 矩形覆盖
    剑指offer【10】- 变态跳台阶
    剑指offer【09】- 跳台阶
  • 原文地址:https://www.cnblogs.com/fandx/p/12150672.html
Copyright © 2011-2022 走看看