我正在开发新软件,我需要像TeamViewer和Skype之间那样交流这些应用程序。对于这个挑战,我读了太多文章和编写代码,但我不能这样做。我必须使用TCP,它不能是UDP。数据安全对我的应用非常重要。
http://www.codeproject.com/Articles/807861/Open-NAT-A-NAT-Traversal-library-for-NET-and-Mono
我发现 N (etwork) A (地址) T (翻译)可以解决我的问题并使用它。我将相同的代码写入他们所说的内容,但仍然无法正常工作......
LISTENER 客户 CODES
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。但是为什么?
请帮助我并指导我。我的代码有什么问题?我究竟做错了什么?我怎么解决这个问题?
感谢所有答案和帮助。祝你有个美好的一天,好的作品......
答案 0 :(得分:0)
它正在监听0.0.0.0
,因为您已将IpAddress.Any
传递给您的侦听器,该侦听器会监听所有IPv4接口"。这应该在netstat中显示为0.0.0.0
。
根据微软:
提供一个IP地址,指示服务器必须侦听所有网络接口上的客户端活动。该字段是只读的。
Socket.Bind方法使用Any字段指示Socket实例必须侦听所有网络接口上的客户端活动。 任意字段相当于点分四位表示法中的0.0.0.0。