我正在开发一个.NET应用程序,它将使位于因特网上任何位置(通常位于NAT之后)的对计算机能够并行地交换消息。我做了一些可能的解决方案的研究,并得出结论,也许WCF双工P2P连接适合我所需要的东西。因为我是WCF的新手,所以我创建了一个小型的测试应用程序,它似乎在一般情况下运行良好--向另一方发送特定消息的对等程序也会在自己的接口上调用并接收回它。这是代码
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接收数据: Packet1 Peer2接收数据: Packet1 Peer1接收数据: Packet2 Peer2接收数据: Packet2
当我想看到
Peer2接收数据: Packet1 Peer1接收数据: Packet2
当然,我可以在我的应用程序中做一些技巧来过滤掉不必要的传入流量,但在此之前,我想知道
发布于 2014-07-10 00:50:43
您需要RemoteOnlyMessagePropagationFilter:当您创建Peer 2对等通道时:
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;
}发布于 2013-12-19 14:26:29
我能想到的最直接的答案是使用一个身份识别方案,并确保你没有发送给自己。一旦确定了所有连接到的对等点(可能是托管列表?)只需对其进行迭代,并将数据包发送到每个包。
https://stackoverflow.com/questions/20683529
复制相似问题