【发布时间】:2016-06-27 18:14:42
【问题描述】:
我正在开发新软件,我需要在这些应用程序之间进行交流,例如 TeamViewer 和 Skype。对于这个挑战,我阅读了太多文章并编写了代码,但我做不到。我必须使用 TCP,它不能是 UDP。数据安全对我的应用非常重要。
http://www.codeproject.com/Articles/807861/Open-NAT-A-NAT-Traversal-library-for-NET-and-Mono
我发现 N(etwork)A(address)T(ranslation) 可以解决我的问题并使用它。我按照他们所说的编写了相同的代码,但仍然无法正常工作......
监听器客户代码
NatDiscoverer discoverer = new NatDiscoverer();
CancellationTokenSource cts = new CancellationTokenSource(5000);
NatDevice device = await discoverer.DiscoverDeviceAsync(PortMapper.Upnp, cts);
// display the NAT's IP address
Console.WriteLine("The external IP Address is: {0} ", await device.GetExternalIPAsync());
// create a new mapping in the router [external_ip:1702 -> host_machine:1602]
await device.CreatePortMapAsync(new Mapping(Protocol.Tcp, 1602, 1702, "For testing"));
IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, 1602);
socket = new Socket(endPoint.AddressFamily, SocketType.Stream,ProtocolType.Tcp);
socket.SetIPProtectionLevel(IPProtectionLevel.Unrestricted);
socket.Bind(endPoint);
socket.Listen(4);
请求发件人客户代码
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("100.96.106.192"), 1602);
sock.Connect(ipep);
他们是 2 个客户,我想像这样联系他们。 “100.96.106.192”是计算机公共IP(不是路由器(外部)IP)..
对于这个挑战,我也可以使用除 WCF 之外的其他语言或其他库,因为我的应用需要独立于平台工作。
例如,我启动 Listener Client 并进入 'cmd',我写了 'netstat -a' 我看到,它监听的是 0.0.0.0:1602。但是为什么呢?
请帮助我并指导我。我的代码有什么问题?我究竟做错了什么?我怎么解决这个问题?
感谢所有答案和帮助。祝你有美好的一天,干得好......
【问题讨论】:
标签: c# sockets network-programming p2p nat