网络编程 - 应用通信

时间:2016-06-27 18:14:43

标签: c# sockets network-programming p2p nat

我正在开发新软件,我需要像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。但是为什么?

请帮助我并指导我。我的代码有什么问题?我究竟做错了什么?我怎么解决这个问题?

感谢所有答案和帮助。祝你有个美好的一天,好的作品......

1 个答案:

答案 0 :(得分:0)

它正在监听0.0.0.0,因为您已将IpAddress.Any传递给您的侦听器,该侦听器会监听所有IPv4接口"。这应该在netstat中显示为0.0.0.0

根据微软:

  

提供一个IP地址,指示服务器必须侦听所有网络接口上的客户端活动。该字段是只读的。

     

Socket.Bind方法使用Any字段指示Socket实例必须侦听所有网络接口上的客户端活动。   任意字段相当于点分四位表示法中的0.0.0.0。

https://msdn.microsoft.com/en-us/library/system.net.ipaddress.any%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396