zoukankan      html  css  js  c++  java
  • Tcp/Ip协议理解_2

    Linux网络编程基础API

    • socket地址API(port ip
    • socket基础API  ( 创建 命名 监听socket 接受链接 发起连接 读写数据 获取地址信息 检测带外标记 设置socket选项
    • 网络信息API    (主机和IP地址之间的转换  服务名称和端口号之间的转换 netdb.h

    1.socket地址API

    •   大端:高位字节在内存的低地址处 (网络
    •         小段:低位字节(0~7) 在内存的高地址处 ( 主机
    #include<netinet/in.h>
    unsigned long int htonl(unsigned long int hostlong); //转换IP
    unsigned short int htons(unsigned short int hostshort); //转换port
    unsigned long int ntohl(unsigned long int netlong);
    unsigned short int ntohs(unsigned short int netshort);

    2.通用socket地址(

    #include<bits/socket.h>
    struct sockaddr
    {
    sa_family_t sa_family; //地址族 AF_INET AF_UNIX AF_INET6  对应协议族(domain PF_INET PF_UNIX 。。。
    char sa_data[14];  //存放socket地址值 
    }

    3.专用socket地址

    • linux为各个协议族提供专门的socket地址结构体
    • UNIX本地协议族
    • #include<sys/un.h>
      struct sockaddr_un
      {
      sa_family_t sin_family;/*地址族:AF_UNIX*/
      char sun_path[108];/*文件路径名*/
      };

    4.TCP/IP协议族

    • IPv4 
    struct sockaddr_in
    {
    sa_family_t sin_family;/*地址族:AF_INET*/
    u_int16_t sin_port;/*端口号,要用网络字节序表示*/
    struct in_addr sin_addr;/*IPv4地址结构体,见下面*/
    };
    struct in_addr
    {
    u_int32_t s_addr;/*IPv4地址,要用网络字节序表示*/
    };
    struct sockaddr_in6
    {
    sa_family_t sin6_family;/*地址族:AF_INET6*/
    u_int16_t sin6_port;/*端口号,要用网络字节序表示*/
    u_int32_t sin6_flowinfo;/*流信息,应设置为0*/
    struct in6_addr sin6_addr;/*IPv6地址结构体,见下面*/
    u_int32_t sin6_scope_id;/*scope ID,尚处于实验阶段*/
    };
    struct in6_addr
    {
    unsigned char sa_addr[16];/*IPv6地址,要用网络字节序表示*/
    };

    5.IP地址转换函数

    我们通常使用点分十进制字符串表示IPv4地址  但编程中需要把他们转换为二进制整数 方便使用 

    #include<arpa/inet.h>
    in_addr_t inet_addr(const char*strptr);
    int inet_aton(const char*cp,struct in_addr*inp);
    char*inet_ntoa(struct in_addr in);

    inet_addr 函数用点分十进制字符串表示的IPv4地址 转化为网络字节序整数表示的IPv4地址

    inet_aton 函数同上 将结果存储于inp指向的地址结构体  成功返回1 失败0

    inet_ntoa 将网络字节序表示的IPv4转换为 点分十进制

    #include<arpa/inet.h>
    int inet_pton(int af,const char*src,void*dst);
    const char*inet_ntop(int af,const void*src,char*dst,socklen_t
    cnt);

    inet_pton 与上面得函数功能相同  af  AF_INET 等

    inet_ntop 相反 cnt 指定目标存储单元大小

    可以通过宏指定

    #include<netinet/in.h>
    #define INET_ADDRSTRLEN 16
    #define INET6_ADDRSTRLEN 46

      

  • 相关阅读:
    MySQL日志
    MySQL索引和事务
    【收集】腾讯AlloyTeam
    js基础知识点(只有点)
    【扩展】Canvas绘制列表的尝试
    开播 开博 凯博
    【总结】移动web问题小结
    〖前端开发〗HTML/CSS基础知识学习笔记
    第四次读书笔记——《代码大全》(续)
    C++笔记(1)
  • 原文地址:https://www.cnblogs.com/jingchu/p/9997089.html
Copyright © 2011-2022 走看看