首页 > 系统相关 >IPv6 - linux网络编程

IPv6 - linux网络编程

时间:2023-08-05 15:11:06浏览次数:46  
标签:linux addr const ADDR IN6 编程 IPv6 struct

IPv6 网络编程

假设双栈服务器有一个IPv4地址、和一个IPv6地址:

  1. IPv6 服务器启动后创建一个IPv6的监听套接字,假设绑定通配地址
  2. 客户端调用 connect,发送要给 IPv4 SYN 给服务端
  3. 服务端接收 IPv4 SYN 设置一个标识指示本连接使用IPv4映射的IPv6地址,然后响应一个 IPv4 SYN/ACK。连接建立后由accept返回一个 IPv4 映射的 IPv6 地址给用户进程
  4. 客户端和服务器端所有通信都使用 IPv4 传输数据
  5. 除非显示检查,例如使用 IN6_IS_ADDR_V4MAPPED

双栈主机处理监听套接字规则:

  • IPv4 套接字只接收 v4 版本连接
  • 绑定了通配地址的 IPv6 监听套接字,且未设置 IPV6_V6ONLY,则能处理 v4 和 v6 版本
  • 绑定了除 IPv4 映射的IPv6 地址外的某个非通配 IPv6 地址,或通配地址设置了 IPV6_V6ONLY 则只能接收 IPv6 连接

带*的表示取决于用户操作:通过AAAA记录发送v6数据报则不能工作,通过A记录获得一个IPv4映射的IPv6地址返回给客户则能工作

// IPv6地址测试宏
#include <netinet/in.h>

// 若为指定类型的地址,返回非0值,否则返回0
int IN6_IS_ADDR_UNSPECIFIED(const struct in6_addr* a);
int IN6_IS_ADDR_LOOPBACK(const struct in6_addr* a);
int IN6_IS_ADDR_MULTICAST(const struct in6_addr* a);
int IN6_IS_ADDR_LINKLOCAL(const struct in6_addr* a);
int IN6_IS_ADDR_SITELOCAL(const struct in6_addr* a)
int IN6_IS_ADDR_SITELOCAL(const struct in6_addr* a);
int IN6_IS_ADDR_V4MAPPED(const struct in6_addr* a);
int IN6_IS_ADDR_V4COMPAT(const struct in6_addr* a);

int IN6_IS_ADDR_MC_NODELOCAL(const struct in6_addr* a);
int IN6_IS_ADDR_MC_LINKLOCAL(const struct in6_addr* a);
int IN6_IS_ADDR_MC_SITELOCAL(const struct in6_addr* a);
int IN6_IS_ADDR_MC_ORGLOCAL(const struct in6_addr* a);
int IN6_IS_ADDR_MC_GLOBAL(const struct in6_addr* a);

 

标签:linux,addr,const,ADDR,IN6,编程,IPv6,struct
From: https://www.cnblogs.com/zhh567/p/17607978.html

相关文章

  • Linux5
    vi编辑器1.vi\vim编辑器vi\vim是Linux中最经典的文本编辑器,vim是vi的加强版,兼容vi的所有指令vi\vim编辑器的三种工作模式:命令模式:命令模式下,所敲的按键编辑器都理解为命令,以命令驱动执行不同的功能。此模型下,不能自由进行文本编辑。 输入模式:也就是编辑模式、插入......
  • 10.1 网络编程
    客户端-服务器编程模型每个网络应用都是基于客户端-服务器模型的。采用这个模型,一个应用是由一个服务器进程和一个或者多个客户端进程组成。服务器管理某种资源,并且通过操作这种资源来为它的客户端提供某种服务。例如,一个Web服务器管理着一组磁盘文件,它会代表客户端进行检索和执......
  • Linux-CentOS7_RPM包管理
    常见的软件包封装类型封装类型说明rpm软件包扩展名为“.rpm”一般为二进制包源代码软件包一般为“.tar.gz”、“.tar.bz2”等格式的压缩包包含程序的原始代码附带安装程序的软件包在压缩包内提供install.sh、setup等安装程序或以“.bin”格式的单个执行文件提供绿色免安装的软件......
  • UDP 编程
    UDP编程#include<sys/socket.h>//可以发送或接收一个长度为0的数据报ssize_trecvfrom(intsockfd,void*buf,size_tnbytes,intflags,//常与recvsendrecvmsgsendmsg配合structsockaddr*from,sockl......
  • Linux 网络编程常用辅助函数
    最大地址结构structsockaddr_storage;//足够大,能够支持任何套接字地址结构从套接字获取信息 //获取本地连接的地址externintgetsockname(int__fd,__SOCKADDR_ARG__addr,socklen_t*__restrict__len)__THROW;//获取连接另一侧的地址externintgetpeername(......
  • linux系统 nginx-部署安装
    以CentOS7.9为例下载nginx,当前版本以 nginx-1.19.3为例安装依赖,已安装可跳过yuminstall-ygcc-c++opnesslpcre-develzlibzlib-deve但是有时候会有各种原因报错,你可以选择去解决,也可以换个思路,那么我不从yum源下载了,直接从网上下载所需的库进入/optcd/opt安装pcre库w......
  • 《安富莱嵌入式周报》第319期:声音编程器,开源激光雕刻机,自制600W海尔贝克无刷电机,车用
    周报汇总地址:http://www.armbbs.cn/forum.php?mod=forumdisplay&fid=12&filter=typeid&typeid=104 更新视频教程:更新第7期ThreadX视频教程:如何实现RTOS高效的任务管理,抢占式调度,时间片调度和零中断延迟(2023-07-31)https://www.armbbs.cn/forum.php?mod=viewthread&tid......
  • Linux环境编程day03--文件管理
    分别使用标准IO和系统IO写入一百万个整数到文件,测试谁的时间更短?为什么?结论:在同等数据的写入下,使用标准IO要比直接使用系统IO更快原因:标准IO有缓冲区机制,在执行fwrite写文件时,数据不是直接调用系统IO写入磁盘,而是先存放在内存的缓冲区中,直到缓冲区满后才会调用一次系统IO全部写......
  • Linux环境编程day04--信号产生与处理
    信号管理基本概念1、中断当进程接收到消息后中止当前正在进行进程,转而去执行其它任务,等其它任务执行结束后再返回刚刚中止的位置,可以继续往下运行这种执行模式称为中断中断分为硬件中断、软件中断,硬件中断是由硬件设备引发的、软件中断是执行了中断指令引发2、信号信号是一......
  • 【雕爷学编程】Arduino动手做(182)---DRV8833双路电机驱动模块
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞......