• IPv4&&IPv6地址结构分析


    IPv4套接字地址结构:

    套接字都需要有一个指向套接字地址结构的指针作为参数。每个协议簇都定义它自己的套接字地址结构。这些结构的名字均已sockaddr_开头,并以对应每个协议族的唯一后缀结尾。

    windows引入了winsock2后,程序在link时需要的库文件也发生了变化。winsock.h对应的是wsock32.lib,而winsock2需要的是ws2_32.lib。这是需要注意的地方,否则连编会失败。同时,有些程序是include了<windows.h>。这个头文件本身包含了<winsock.h>,这是就需要注意include的顺序,<winsock2.h>必须在<windows.h>之前include,才能避免重复定义的问题。

    #include <WINSOCK2.H>

    #pragma comment(lib,"ws2_32.lib")

    #include <WINSOCK.H>

    #pragma comment(lib,“wsock32.lib”)

    #include <WINSOCK2.H>

    #include <WINSOCK.H>

    --WINDOWS下的IPv4结构:<winsock2.h>

    clip_image002

    clip_image004

    l in_addr是一个结构体表示地址信息,其中in_addr.s_addr表示一个网络序形式的IPv4地址,可以使用inet_addr()函数对点式地址进行转换。

    l 其中sockadr_in表示IPv4的SOCKET地址结构,IPv6不能用;

    --UNIX下的IPv4结构:<netinet/in.h>

    struct in_addr { /* 32-bit IPv4 address */

    in_addr_t s_addr; /* network byte ordered */

    };

    struct sockaddr_in {

    uint8_t sin_len; /* length of structure(16) */

    sa_family_t sin_family; /* AF_INET */

    in_port_t sin_port; /* 16-bit TCP or UDP port number */

    /* network byte ordered */

    struct in_addr sin_addr; /* 32-bit IPv4 address */

    /* network byte ordered */

    char sin_zero[8]; /* unused */

    }

    --通用套接字地址结构:UNIX:<sys/socket.h>

    当作为一个参数传递进任何套接字函数时,套接字地址结构总是以引用形式(也就是以指向该结构的指针)来传递。然而以这样的指针作为参数之一的任何套接字函数必须处理来自所有支持的任何协议簇的套接字地址结构。

    于是定义了这样的地址结构:

    clip_image006

    于是套接字函数被定义为以指向某个通用套接字结构的一个指针作为其参数之一,这正如bind函数的ANSI C函数原型所示:

    clip_image008

    这就要求对这些函数的任何调用都必须要将指向特定于协议的套接字地址结构的指针进行强制类型转换,变成指向某个通用套接字地址结构的指针。

    --UNIX下的IPv6结构:<netinet/in.h>

    struct in6_addr { /* 128-bit IPv6 address */

    unit8_t s6_addr; /* network byte ordered */

    };

    struct sockaddr_in {

    uint8_t sin6_len; /* length of structure(28) */

    sa_family_t sin6_family; /* AF_INET */

    in_port_t sin6_port; /* 16-bit TCP or UDP port number */

    /* network byte ordered */

    unit32_t sin6_flowinfo; /* flow information, undifined */

    struct in6_addr sin6_addr; /* 128-bit IPv6 address */

    /* network byte ordered */

    uint32_t sin6_scope_id; /* set of interface for a scope */

    }

    --WINDOWS下的IPv6结构:#include <ws2tcpip.h>

    clip_image010

    当我们创建SOCKET时,启用AF_INET则表示IPv4,启用AF_INET6则表示IPv6;

  • 相关阅读:
    模板引擎使用详解:包含公共模板
    ThinkPHP3.2 常量参考
    ThinkPHP的全部配置选项
    报错compile_str() flow.php on line 375的解决方法
    mysql如何更新一个表中的某个字段值等于另一个表的某个字段值
    Mac下新安装的MySQL无法登陆root用户解决方法
    IOS-第三方开源库
    IOS-每个程序员的编程之路上都应该看这11本书
    IOS-程序员和设计师必备的20个CSS工具
    IOS-2016年最好的15个Web设计和开发工具
  • 原文地址:https://www.cnblogs.com/davidsguo008/p/3580489.html
Copyright © 2020-2023  润新知