`
xyliufeng
  • 浏览: 87267 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

IPv6、IPv4中的四个地址结构:sockaddr、sockaddr_in、sockaddr_in6、addrinfo的对比

 
阅读更多
struct sockaddr {
      unsigned short sa_family;     /* address family, AF_xxx */
      char sa_data[14];                  /* 14 bytes of protocol address */
};

struct sockaddr_in {
      short int sin_family;                /* Address family AF_INET */
      unsigned short int sin_port;    /* Port number */
      struct in_addr sin_addr;         /* Internet address */
      unsigned char sin_zero[8];     /* Same size as struct sockaddr */
};
struct in_addr {
      unsigned long s_addr;           /* Internet address */
};

struct sockaddr_in6 {
      sa_family_t sin6_family;         /* AF_INET6 */
      in_port_t sin6_port;               /* transport layer port # */
      uint32_t sin6_flowinfo;           /* IPv6 traffic class & flow info */
      struct in6_addr sin6_addr;    /* IPv6 address */
      uint32_t sin6_scope_id;        /* set of interfaces for a scope */
};
struct in6_addr {
      uint8_t s6_addr[16];            /* IPv6 address */
};

struct addrinfo{
      int ai_flags;                         /* AI_PASSIVE,AI_CANONNAME,AI_NUMERICHOST */
      int ai_family;                        /* AF_INET,AF_INET6 */
      int ai_socktype;                   /* SOCK_STREAM,SOCK_DGRAM */
      int ai_protocol;                   /* IPPROTO_IP, IPPROTO_IPV4, IPPROTO_IPV6 */
      size_t ai_addrlen;               /* Length */
      char *ai_cannoname;         /* */
      struct sockaddr *ai_addr;   /* struct sockaddr */
      struct addrinfo *ai_next;      /* pNext */
}
分享到:
评论

相关推荐

    IPV4和IPV6兼容的socket编程(原著)

    在处理未知地址类型时,可以先将其初始化为`sockaddr_storage`,然后根据需要转换为`sockaddr_in`或`sockaddr_in6`。 2. **IPv4到IPv6的移植**: - 移植过程中,需要确保使用`AF_UNSPEC`作为`bind()`或`connect()...

    毕业设计 java ipv6/ipv4 socket 网络编程

    - `sockaddr_in6`:IPv6地址结构体。 **2. 结构体示例** - **sockaddr**:用于表示各种类型的地址。 - `sa_family`:地址族类型。 - `sa_data`:协议地址。 - **sockaddr_in**:用于IPv4地址。 - `sin_family`:...

    ipv6 编程指导 从ipv4到ipv6

    为了处理这种新的地址格式,IPv6套接字编程中,`sockaddr_in6`结构体代替了IPv4中的`sockaddr_in`,用来存储IPv6地址。此外,函数如`getaddrinfo`和`getnameinfo`被添加,以支持更灵活的地址解析和服务名称查找。 ...

    ipv6通信demo.rar

    对于IPv6,我们将使用`sockaddr_in6`结构: ```cpp struct sockaddr_in6 server_addr; memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin6_family = AF_INET6; server_addr.sin6_port = htons(port_...

    VC++ 6 IPV6程序

    - **结构体和常量**:比如`sockaddr_in6`结构体用于存储IPv6地址信息,`AF_INET6`常量标识IPv6地址族。 4. **程序实现**: - **创建套接字**:使用`socket`函数创建IPv6套接字,指定地址族为AF_INET6。 - **绑定...

    基于IPv4_IPv6双协议栈的通信模块及实现

    IPv6套接字地址结构被命名为sockaddr_in6,其中包含128位的IPv6地址,以及传输层端口号、套接字类型等信息。 #### IPv6的Socket API函数 IPv6的Socket API函数在很大程度上继承了IPv4的API,但为了适应IPv6的特性...

    linux ipv6 socket(tcp&udp)

    在Linux操作系统中,IPv6(Internet Protocol version 6)是一种互联网协议,用于替代原有的IPv4。IPv6提供了更大的地址空间,增强了安全性,并简化了网络配置。本知识点将深入探讨Linux环境下的IPv6套接字(socket...

    IPv6 Network Programming.pdf

    - 使用通用的数据类型,如`struct sockaddr_in6`而不是`struct sockaddr_in`。 - 在创建套接字时指定`AF_INET6`。 - 使用`getaddrinfo()`函数获取地址信息,该函数支持IPv4和IPv6地址。 - 对于IPv6地址,使用`...

    ipv6_xp_测试例子及说明

    与IPv4不同,IPv6套接字需要指定`AF_INET6`地址族,并且在指定地址时要使用`struct sockaddr_in6`结构。 5. **IPv6兼容性**:XP系统可能需要安装额外的更新或补丁以完全支持IPv6,因为原始版本的XP并不默认包含IPv6...

    获取本机网卡信息(包括ipv6 地址信息)

    struct in6_addr* addr = &((struct sockaddr_in6*)ptr->ai_addr)->sin6_addr; char ipstr[INET6_ADDRSTRLEN]; inet_ntop(AF_INET6, addr, ipstr, INET6_ADDRSTRLEN); std::cout << "IPv6 Address: " ...

    c++builder获取本地IP

    IPv6地址会存储在`sockaddr_in6`结构中。 请注意,上述代码适用于Windows环境,且未处理异常情况。在实际应用中,你应该添加适当的错误处理和异常安全代码。 此外,C++Builder也提供了VCL组件(如TIdTCPClient和...

    c++ 通过域名查 IP 服务器地址

    struct sockaddr_in6* ipv6 = (struct sockaddr_in6*) res->ai_addr; addr = &(ipv6->sin6_addr); } inet_ntop(res->ai_family, addr, ipstr, INET6_ADDRSTRLEN); std::cout ...

    C++基于Socket的TCP网络编程IPv6

    在IPv6环境下,开发者需要使用`AF_INET6`作为套接字地址族,`struct sockaddr_in6`作为地址结构体,以及相关的IPv6特定函数,例如`getaddrinfo()`和`freeaddrinfo()`。 在调试和测试阶段,开发者可能会遇到一些常见...

    VC获取IP地址列表源代码包括NSIS的调用方式

    struct sockaddr_in6* ipv6 = (struct sockaddr_in6*)ptr->ai_addr; ipPtr = &(ipv6->sin6_addr); } getnameinfo(ptr->ai_addr, ptr->ai_addrlen, ipStringBuffer, sizeof(ipStringBuffer), nullptr, 0, NI_...

    winsocket编程获得本机IP地址和计算机名称

    每个`struct sockaddr_in`或`struct sockaddr_in6`结构体包含了IP地址和端口号。对于IPv4,`sin_addr.s_addr`是IP地址;对于IPv6,`sin6_addr`是IP地址。 ```c++ for (struct addrinfo* ptr = res; ptr != NULL; ...

    获得主机名和IP地址

    struct sockaddr_in6* ipv6 = (struct sockaddr_in6*)ptr->ai_addr; addr = &(ipv6->sin6_addr); char ip6str[INET6_ADDRSTRLEN]; inet_ntop(AF_INET6, addr, ip6str, INET6_ADDRSTRLEN); std::cout << "IPv6 ...

    VC获取电脑的IP地址的一个简单例子

    sockaddr_in6* sin6 = (sockaddr_in6*)pAddress->Address.lpSockaddr; char ipStringBuffer[INET6_ADDRSTRLEN]; inet_ntop(AF_INET6, &sin6->sin6_addr, ipStringBuffer, INET6_ADDRSTRLEN); printf("IPv6 ...

    ip mac hostname 之间相互获取方法

    1. 解析输入的IPv6地址,创建一个`sockaddr_in6`结构。 2. 使用`getaddrinfo`函数,设置适当的`hints`,查询主机名。 3. 调用`getnameinfo`函数,将解析得到的地址结构转换为主机名。 4. 处理返回的结果,如检查错误...

Global site tag (gtag.js) - Google Analytics