You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用C#实现无需端口转发的全球P2P数据传输?

适合.NET 6的轻量P2P通信方案(支持NAT穿透)

方案1:LibP2P.NET(开箱即用的现代P2P框架)

LibP2P是跨平台的P2P协议栈,其C#实现完全适配.NET 6,自带NAT穿透(AutoNAT、STUN)、对等发现功能,无需手动处理端口转发,刚好满足你传输byte数组或字符串的需求。

快速实现步骤:

  1. 安装NuGet包:Install-Package LibP2P
  2. 核心示例代码:
using LibP2P;
using LibP2P.Protocols.Chat;

// 创建并启动P2P节点
var node = await NodeBuilder.Create()
    .AddAddress("/ip4/0.0.0.0/tcp/0") // 自动分配本地监听端口
    .AddProtocol(new ChatProtocol())
    .StartAsync();

// 打印节点标识与监听地址
Console.WriteLine($"Node ID: {node.Id}");
foreach (var addr in node.Addresses)
{
    Console.WriteLine($"Listening on: {addr}");
}

// 连接已知对等节点(需先通过中继/服务发现交换节点地址)
if (MultiAddress.TryParse("/ip4/xxx.xxx.xxx.xxx/tcp/xxxx/p2p/peer-id", out var peerAddr))
{
    await node.ConnectAsync(peerAddr);
    // 发送byte数组
    var chatProtocol = node.Protocols.Find<ChatProtocol>();
    await chatProtocol.SendAsync(peerAddr.Id, new byte[] { 0x01, 0x02, 0x03 });
    // 发送字符串
    await chatProtocol.SendAsync(peerAddr.Id, Encoding.UTF8.GetBytes("Hello P2P"));
}

// 监听接收数据
node.Protocols.Find<ChatProtocol>().MessageReceived += (_, args) =>
{
    Console.WriteLine($"Received byte array: {BitConverter.ToString(args.Message)}");
    Console.WriteLine($"Received string: {Encoding.UTF8.GetString(args.Message)}");
};

await Task.Delay(-1);

关键提示:

  • 首次连接需通过服务发现(如内置DHT)或第三方中继交换对等节点地址,LibP2P已封装相关逻辑,启用即可。
  • 框架自动处理NAT穿透,无需手动编写UDP打洞代码。

方案2:Open.NAT + 自定义UDP打洞(轻量手动实现)

如果需要更轻量化的方案,可使用Open.NAT识别NAT类型,配合简单UDP逻辑实现打洞,适合仅需基础数据传输的场景。

快速实现步骤:

  1. 安装NuGet包:Install-Package Open.NAT
  2. 核心示例代码:
using Open.NAT;
using System.Net;
using System.Net.Sockets;

// 1. 获取NAT设备信息与公网IP
var natDiscoverer = new NatDiscoverer();
var natDevice = await natDiscoverer.DiscoverDeviceAsync();
var publicIp = await natDevice.GetExternalIPAsync();

// 2. 启动UDP监听
var udpClient = new UdpClient(0);
var localEndPoint = (IPEndPoint)udpClient.Client.LocalEndPoint;
Console.WriteLine($"Local endpoint: {localEndPoint}");
Console.WriteLine($"Public endpoint: {publicIp}:{localEndPoint.Port}");

// 3. 通过中继服务器交换双方公网端点(需自行搭建简单HTTP中继)
var remotePublicEndPoint = new IPEndPoint(IPAddress.Parse("xxx.xxx.xxx.xxx"), 12345);

// 4. 发送打洞数据包,触发NAT映射
await udpClient.SendAsync(new byte[] { 0x00 }, 1, remotePublicEndPoint);

// 5. 监听接收数据
_ = Task.Run(async () =>
{
    while (true)
    {
        var result = await udpClient.ReceiveAsync();
        Console.WriteLine($"Received from {result.RemoteEndPoint}: {BitConverter.ToString(result.Buffer)}");
        Console.WriteLine($"Received string: {Encoding.UTF8.GetString(result.Buffer)}");
    }
});

await Task.Delay(-1);

关键提示:

  • 必须依赖一个简单中继服务器(如HTTP API)来交换双方的公网端点信息。
  • Open.NAT会自动识别NAT类型,适配不同场景的打洞逻辑。

方案3:优化SIPSorcery的WebRTC数据通道(针对你之前的尝试)

你之前尝试的SIPSorcery未成功,大概率是未正确配置STUN/TURN服务器导致穿透失败,以下是适配.NET 6的简化示例:

快速实现步骤:

  1. 安装NuGet包:Install-Package SIPSorcery
  2. 核心示例代码:
using SIPSorcery.Net;
using System.Text;

// 配置STUN服务器(使用公共STUN服务即可)
var rtcConfig = new RTCConfiguration
{
    IceServers = new List<RTCIceServer> 
    { 
        new RTCIceServer { Urls = new List<string> { "stun:stun.l.google.com:19302" } } 
    }
};

// 创建PeerConnection与数据通道
var pc = new RTCPeerConnection(rtcConfig);
var dataChannel = pc.CreateDataChannel("data", new RTCDataChannelInit { Ordered = true });

// 通道打开后发送数据
dataChannel.OnOpen += () =>
{
    dataChannel.Send(new byte[] { 0x01, 0x02, 0x03 });
    dataChannel.Send("Hello WebRTC P2P");
};

// 监听接收数据
dataChannel.OnMessage += (msg) =>
{
    if (msg.IsBinary)
    {
        Console.WriteLine($"Received byte array: {BitConverter.ToString(msg.Data)}");
    }
    else
    {
        Console.WriteLine($"Received string: {Encoding.UTF8.GetString(msg.Data)}");
    }
};

// 生成Offer并发送给对方(需通过中继传递SDP与ICE候选)
var offer = await pc.CreateOfferAsync();
await pc.SetLocalDescriptionAsync(offer);
// 接收对方Answer后设置:await pc.SetRemoteDescriptionAsync(answer);

await Task.Delay(-1);

关键提示:

  • 严格对称NAT环境下需添加TURN服务器(可自行搭建或使用公共服务)。
  • SDP与ICE候选的交换需通过第三方通道(如WebSocket、HTTP中继)完成。

内容的提问来源于stack exchange,提问作者D1i2m3

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 11:47:44