gpt4 book ai didi

c# - WCF 双工 P2P,避免对等点调用自身并连接到特定对等点

转载 作者:行者123 更新时间:2023-11-30 22:10:41 25 4
gpt4 key购买 nike

我正在开发一个 .NET 应用程序,它可以使位于 Internet 上任何位置(通常在 NAT 后面)的计算机对能够在彼此之间并行交换消息。我对可能的解决方案进行了一些研究,得出的结论是 WCF 双工 P2P 连接可能适合我的需要。由于我是 WCF 的新手,我创建了一个小型测试应用程序,它似乎通常运行良好,但有一个异常(exception) - 向另一端发送特定消息的对等方也会在其自己的接口(interface)上获得调用并接收它。这是代码

using System;
using System.Threading.Tasks;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.ServiceModel.Description;

[ServiceContract(CallbackContract = typeof(IDataChannel))]
public interface IDataChannel
{
[OperationContract(IsOneWay = true)]
void SendData(string data);
}

public class WCFP2PTransport : IDataChannel
{
private IDataChannel m_outChannel = null;
private DuplexChannelFactory<IDataChannel> m_factory = null;
private Task m_completion;
private string m_name;

public WCFP2PTransport(string service, string name)
{
m_name = name;
try
{
var binding = new NetPeerTcpBinding();
binding.Security.Mode = SecurityMode.None;

var endpoint = new ServiceEndpoint(
ContractDescription.GetContract(typeof(IDataChannel)),
binding,
new EndpointAddress("net.p2p://" + service));

m_factory = new DuplexChannelFactory<IDataChannel>(
new InstanceContext(this),
endpoint);

m_outChannel = m_factory.CreateChannel();

m_completion = Task.Factory.FromAsync(((ICommunicationObject)m_outChannel).BeginOpen, ((ICommunicationObject)m_outChannel).EndOpen, null);
}
catch (Exception ex)
{
Console.WriteLine(ex);
var tsk = new TaskCompletionSource<bool>();
tsk.SetException(ex);
m_completion = tsk.Task;
}
}

public Task ChannelOpened
{
get
{
return m_completion;
}
}

public void SendToPeer(string data)
{
m_outChannel.SendData(data);
}

// IDataChannel method(s), handle incoming traffic
public void SendData(string data)
{
Console.WriteLine("{0} Received data: {1}", m_name, data);
}

// cleanup code omitted for brevity
}

class Program
{
static void Main(string[] args)
{
var peer1 = new WCFP2PTransport("WCF_P2P_Test", "Peer1");
var peer2 = new WCFP2PTransport("WCF_P2P_Test", "Peer2");

Task.WaitAll(peer1.ChannelOpened, peer2.ChannelOpened);

peer1.SendToPeer("Packet1");
peer2.SendToPeer("Packet2");

Console.ReadKey();
}
}

这个应用程序的输出是

Peer1 Received data: Packet1
Peer2 Received data: Packet1
Peer1 Received data: Packet2
Peer2 Received data: Packet2

虽然我想看看

Peer2 Received data: Packet1
Peer1 Received data: Packet2

当然我可以在我的应用程序中做一些技巧来过滤掉不需要的传入流量,但在这样做之前我想知道

  1. 是否可以将 WCF 配置为在回应自己的呼唤?

  2. 限制对等点只能成对连接的最佳方法是什么? 每个对等点仅连接到特定对等点?我可以想到使用 每对的唯一 P2P 服务名称,这就是为什么有一个 将其提供给对等类构造函数的参数?

最佳答案

您需要 RemoteOnlyMessagePropagationFilter:当您创建 Peer 2 Peer Channel 时:

        var sourceContext = new InstanceContext(sourceObject);

var sourceFactory = new DuplexChannelFactory<TChannel>(sourceContext, endpointName);

TChannel sourceProxy = sourceFactory.CreateChannel();

var remoteOnlyFilter = new RemoteOnlyMessagePropagationFilter();

var peerNode = ((IClientChannel)sourceProxy).GetProperty<PeerNode>();
peerNode.MessagePropagationFilter = remoteOnlyFilter;
try
{
sourceProxy.Open();
}
catch (Exception)
{
sourceProxy.TryCloseOrAbort();
throw;
}

关于c# - WCF 双工 P2P,避免对等点调用自身并连接到特定对等点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20683529/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com