惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
H
Hacker News: Front Page
P
Palo Alto Networks Blog
T
ThreatConnect
Apple Machine Learning Research
Apple Machine Learning Research
博客园_首页
T
True Tiger Recordings
P
Privacy & Cybersecurity Law Blog
B
Blog
IT之家
IT之家
Last Week in AI
Last Week in AI
F
Full Disclosure
Hacker News: Ask HN
Hacker News: Ask HN
C
Comments on: Blog
Microsoft Azure Blog
Microsoft Azure Blog
C
Cybersecurity and Infrastructure Security Agency CISA
Microsoft Security Blog
Microsoft Security Blog
博客园 - 【当耐特】
N
News and Events Feed by Topic
NISL@THU
NISL@THU
腾讯CDC
雷峰网
雷峰网
Security Latest
Security Latest
李成银的技术随笔
M
Microsoft Research Blog - Microsoft Research
L
LangChain Blog
L
Lohrmann on Cybersecurity
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Check Point Blog
Y
Y Combinator Blog
Recent Announcements
Recent Announcements
博客园 - Franky
N
News | PayPal Newsroom
V
V2EX
A
About on SuperTechFans
The Register - Security
The Register - Security
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google Online Security Blog
Google Online Security Blog
MyScale Blog
MyScale Blog
Cisco Talos Blog
Cisco Talos Blog
Vercel News
Vercel News
WordPress大学
WordPress大学
C
Cyber Attacks, Cyber Crime and Cyber Security
The Hacker News
The Hacker News
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
爱范儿
爱范儿
A
Arctic Wolf
L
LINUX DO - 最新话题
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

博客园 - 至尊龙骑

C# 使用FFmpeg 命令录音录像时设置 水印以及水印位置 C# 使用FFmpeg 命令 水印以及水印位置 录音录像时设置分辨率-分辨率一般是宽高比是 4:3 和16:9 少数是 5:4 FFmpeg 命令 水印以及水印位置 FFmpeg 命令录音录像时分辨率 FFmpeg 查看分辨率以及指定分辨率 C# 中监听 IPv6 回环地址(Loopback Address)----socket和tcp IPv6 地址 后端设置了跨域但是还是提示跨域问题,原因是这里有两个独立的安全策略在起作用:Chrome和Edge浏览器安全策略强制修改方案 开放所有跨域 ----前端和后端 Win11 上遇到的 WinForm 文件拖拽功能失效,但在 Win10 或其他系统上正常的问题 设置iis的后缀名可以下载 linux执行systemctl enable redis.service 报 Failed to execute operation: Bad message linux redis 8.2.1软件开机启动redis.service与etc下的rc.local配置2种方式 Linux redis 8.2.1源码编译 Linux开机启动设置全攻略 Linux 设置nginx 以及java jar自启动 Linux系统简单源码安装NGINX版本1.28.0 DistributedLock 实现.Net分布式锁 Windows 10\11 离线安装.NET Framework 3.5(包括.NET 2.0和3.0) - 至尊龙骑 跨域处理 utools无法搜索快捷方式和部分软件问题
C# 中监听 IPv6 回环地址----HttpListener
至尊龙骑 · 2026-01-21 · via 博客园 - 至尊龙骑

在 C# 中处理 IPv6(特别是结合 HTTP 监听)时,除了基础的监听功能,你还需要关注双栈支持、地址配置以及系统兼容性。结合之前的讨论和相关技术文档,以下是关于在 .NET 环境中深度使用 IPv6 的补充说明和最佳实践:

  1. 关键地址常量

在代码中,不要硬编码字符串,应使用 .NET 提供的静态字段:

  • IPv6 回环地址 (::1):

IPAddress.IPv6Loopback // 推荐

// 或

IPAddress.Parse("::1")

  • IPv6 任意地址 (::):

IPAddress.IPv6Any // 相当于 "::",监听所有 IPv6 接口

  1. 处理“双栈”与 IPV6_V6ONLY 问题

这是 IPv6 编程中最容易出错的地方。默认情况下,Windows 上的 IPv6 套接字可能处于“双栈”模式,这意味着监听 IPv6 地址时,也可能接收到 IPv4 的连接(IPv4 映射到 IPv6 格式,如 ::ffff:127.0.0.1)。

  • 如果你只想处理纯 IPv6 流量:

你需要显式关闭双栈模式,只允许 IPv6 连接。

// 在 Socket 层设置 (例如使用 TcpListener 或原生 Socket)

socket.SetSocketOption(SocketOptionLevel.IPv6, SocketOptionName.IPv6Only, true);

    • 注意:一旦开启此选项,该端口将无法接收来自纯 IPv4 客户端的连接。
  • 如果你需要同时支持 IPv4 和 IPv6:

最稳妥的办法是在代码中分别监听两个地址:

    1. 监听 IPAddress.Any (IPv4 任意地址)。
    2. 监听 IPAddress.IPv6Any (IPv6 任意地址),并根据需要设置 IPv6Only。
  1. 使用原生 Socket 监听 IPv6 (底层示例)

如果你不使用 HTTP 框架,而是直接使用 Socket 进行 TCP 通信,代码结构如下:

if (!Socket.OSSupportsIPv6)

{

Console.WriteLine("系统不支持 IPv6");

return;

}

// 1. 创建 IPv6 Socket

Socket listener = new Socket(AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp);

// 2. (可选) 设置为仅 IPv6 模式,防止 IPv4 连接混入

listener.SetSocketOption(SocketOptionLevel.IPv6, SocketOptionName.IPv6Only, true);

// 3. 绑定到 IPv6 回环或任意地址

IPEndPoint endPoint = new IPEndPoint(IPAddress.IPv6Loopback, 12345); // 仅本机

// IPEndPoint endPoint = new IPEndPoint(IPAddress.IPv6Any, 12345); // 所有接口

listener.Bind(endPoint);

listener.Listen(100);

Console.WriteLine("IPv6 服务已启动...");

  1. 调试与测试命令

在 Windows 命令行(CMD)或 PowerShell 中,使用以下命令验证你的服务是否正常启动:

  • 查看监听状态:

netstat -an | findstr :你的端口号

    • 如果看到 [::1]:端口,表示成功监听了 IPv6 回环。
    • 如果看到 [::]:端口,表示监听了所有 IPv6 接口。
  • 测试连接:
    • Ping 测试:ping ::1
    • Telnet 测试:telnet ::1 8080
    • Curl 测试:curl http://[::1]:8080/

总结建议

  • 本地测试:始终使用 ::1 (带方括号) 进行本地测试。
  • 部署配置:在服务器上,如果要允许外部 IPv6 访问,需绑定 :: 并检查防火墙规则。
  • 兼容性:在 .NET Core/.NET 5+ 中,IPv6 支持比旧版 .NET Framework 更完善和默认开启。

在 C# 中监听 IPv6 回环地址(::1),主要取决于你使用的底层组件是 HttpListener(轻量级)还是 Kestrel(现代 ASP.NET Core 方式)。

以下是针对这两种常见场景的具体实现方法和关键注意事项:

  1. 使用 HttpListener (适用于控制台/WinForm 轻量级服务)

HttpListener 是 .NET Framework 和 .NET Core/5+ 中自带的一个简单 HTTP 侦听器。

核心代码实现

using System;

using System.Net;

class Program

{

static void Main(string[] args)

{

// 1. 配置监听地址:使用 IPv6 回环地址 ::1

// 注意:结尾必须有斜杠 "/"

string url = "http://[::1]:8080/";

// 如果你希望监听所有 IPv6 地址(不仅限于回环),使用: // string url = "http://[::]:8080/"; HttpListener listener = new HttpListener(); listener.Prefixes.Add(url); try { listener.Start(); Console.WriteLine("正在监听 {url} ..."); // 2. 开始接受请求(此处仅为示例,实际应使用异步模式) while (true) { HttpListenerContext context = listener.GetContext(); // 阻塞等待 ProcessRequest(context); } } catch (Exception ex) { Console.WriteLine("错误: {ex.Message}"); // 权限不足通常会抛出异常 } finally { listener.Stop(); } } static void ProcessRequest(HttpListenerContext context) { string responseString = "Hello from IPv6 Loopback!"; byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responseString); HttpListenerResponse response = context.Response; response.ContentLength64 = buffer.Length; response.OutputStream.Write(buffer, 0, buffer.Length); response.Close(); }

}

关键点说明

  1. URL 格式:IPv6 地址必须用方括号 [] 括起来,即 [::1],否则会解析错误。
  2. 权限问题:在 Windows 上运行 HttpListener 需要管理员权限,或者需要预先注册 URL 保留。
  • 解决方法:以管理员身份运行程序,或在 CMD 中执行:
  1. 防火墙:确保 Windows 防火墙允许该端口的入站连接(如果是监听 :: 而不仅是 ::1)。
  2. 使用 Kestrel (适用于 ASP.NET Core)

如果你是在构建 Web API 或 Web 应用,推荐使用 Kestrel。

配置方式

在 Program.cs 或 Startup 中配置:

var builder = WebApplication.CreateBuilder(args);

// 配置 Kestrel

builder.WebHost.ConfigureKestrel(serverOptions =>

{

// 方式 A: 监听特定的 IPv6 回环地址

serverOptions.Listen(IPAddress.IPv6Loopback, 8080);

// 方式 B: 监听所有 IPv6 地址 (包括回环和外部) // serverOptions.Listen(IPAddress.IPv6Any, 8080); // 注意:如果要同时监听 IPv4 和 IPv6,通常需要分别添加两条指令 // serverOptions.Listen(IPAddress.Any, 8080); // IPv4 // serverOptions.Listen(IPAddress.IPv6Any, 8080); // IPv6

});

var app = builder.Build();

app.MapGet("/", () => "Hello World from IPv6!");

app.Run();

  1. 常见问题与排查

问题现象 可能原因 解决方案

访问被拒绝 程序未以管理员运行 右键点击程序 -> "以管理员身份运行"

无法连接 URL 格式错误 确保使用 http://[::1]:端口/ 格式

端口占用 端口被其他程序占用 更换端口号(如 8081, 5000)

只能本机访问 这是正常现象 IPv6 回环地址 ::1 只能被本机访问,外部机器无法连接

总结

  • 目标地址:使用 ::1 表示仅本机回环。
  • 代码写法:在 HttpListener 中使用 "http://[::1]:端口/";在 Kestrel 中使用 IPAddress.IPv6Loopback。
  • 运行环境:Windows 下通常需要管理员权限才能绑定 HTTP 端口。