• [Linux网络编程学习笔记]套接字地址结构


    好久没有看那Linux网络编程这本书了,今天看到了重点部分—TCP套接字。下面先来看看套接字的地址结构

    Linux系统的套接字可以支持多种协议,每种不同的协议都是用不同的地址结构。在头文件<linux/socket.h>中有一个这样的老式结构(现在一般不使用这个结够了)。

    struct sockaddr
    {
        unsigned short  sa_family;  //套接字的协议簇地址类型,TCP/IP协议对于IPv4地址类型为AF_INET
        char            sa_data[14];//存储具体的协议地址
    };

    现在一般使用下面这个sockaddr_in结构(用来设置/获取地址信息):

    struct sockaddr_in
    {
        unsigned short sin_len;      //IPv4地址长度
        short int      sin_family;   //指代协议簇,在TCP套接字编程只能是AF_INET
        unsigned short sin_port;     //存储端口号(使用网络字节顺序),数据类型是一个16为的无符号整形类型
        struct         in_addr sin_addr;//存储IP地址,IP地址是一个in_add结构体(结构在下面)
        unsigned char  sin_zero[8];     //为了让sockaddr与sockaddr_in两个数据结构保持大小相同而保留的空字节
    };

    其中,in_addr这个数据结构:

    struct in_addr
    {
        unsigned long s_addr;   //按照网络字节顺序存储IP地址
    };

    在现在很火的IPv6中套接字地址结构使用了下面这个结构体(结构中的成员是有序排列的):

    #DEFINE SIN6_LEN
    struct sockaddr_in6
    {
        unsigned short int       sin6_len;   //IPv6结构长度,是一个无符号的8为整数,表示128为IPv6地址长度

    short int sin6_family; //地址类型AF_INET6

    unsigned short int sin6_port; //存储端口号,按网络字节顺序

        unsigned short int       sin6_flowinfo;  //低24位是流量标号,然后是4位的优先级标志,剩下四位保留
        struct in6_addr          sin6_addr;      //IPv6地址,网络字节顺序
    };
    struct in6_addr
    {
         unsigned long s6_addr;  //128位的IPv6地址,网络字节顺序
    };

    好了,看个例子更好说明这些结构体的应用,下面以IPv4为例:

    struct sockaddr_in mysock;
    mysock.sin_family = AF_INET;  //TCP地址结构
    mysock.sin_port = htons(3490); //字节顺序转换函数(后面我会介绍的)
    mysock.sin_addr.s_addr = inet_addr("166.111.160.10");//设置IP地址
    bzero(&(mysock.sin_zero),8);//设置sin_zero为8位保留字节
    //如果mysock.sin_addr.s_addr = INADDR_ANY,则不指定IP地址(用于server程序)

    一些基本的函数:

    IP地址转换函数:inet_addr()和inet_ntoa()

    格式:

    unsigned long inet_addr(const char *cp);
    char* inet_ntoa(struct in_addr in);

    作者:涵曦www.hanxi.cc
    出处:hanxi.cnblogs.com
    GitHub:github.com/hanxi
    Email:im.hanxi@gmail.com
    文章版权归本人所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

    《 Skynet 游戏服务器开发实战》

  • 相关阅读:
    【PE/Codecs】YUV文件比较的两种方法
    【Python】删除非空目录的方法shutil.rmtree()以及空目录的方法os.rmdir()
    【SVAC】国家视频编解码标准SVAC的特色和优势
    【SVAC】国标SVAC对飙通行标准,优势何在?
    【SVAC】SVAC推广应用进入关键期和高峰期
    【SVAC】SVAC 2.0安全系统组成
    【SVAC】期待国标视频编解码标准SVAC2.0应用推广!
    【Python】python取整函数和获取文件大小的方法
    【Python】Python中的正则表达式教程
    【Python】 整型数与字符串相互转换
  • 原文地址:https://www.cnblogs.com/hanxi/p/2059307.html
Copyright © 2020-2023  润新知