C# desktop sharing using Windows Desktop Sharing API
我已经编写了一个简单的C#应用??程序,用于使用Windows桌面共享API进行桌面共享
http://msdn.microsoft.com/en-us/library/bb968809.aspx
http://blogs.msdn.com/b/rds/archive/2007/03/08/windows-desktop-sharing-api.aspx
我的大多数应用程序代码均基于此Microsoft博客文章
http://blogs.msdn.com/b/rds/archive/2007/03/23/writing-a-desktop-sharing-application.aspx
我还成功实现了反向连接http://msdn.microsoft.com/en-us/library/aa373312.aspx
我的应用程序在本地网络或VPN上运行良好,但无法与公用网络上的PC共享桌面。
我的主机应用程序生成的邀请看起来像这样
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <E> <A KH="3tSA+NXzzvG8ynVkXTh0RxsPCus=" ID="DIC/0Flybjfj3U5lPvy5B2TWwShPrX1oIkpUB0vrB4mZsjZWY7WCfGnvEUjwhvhK"/> <C> <T ID="1" SID="0"> <L P="51390" N="fe80::596d:88b0:2ef6:bf13%4"/> <L P="51391" N="fe80::103c:155b:b1fc:9854%9"/> <L P="51392" N="2001:0:9d38:6abd:103c:155b:b1fc:9854"/> <L P="51393" N="2002:c31d:e328:1000:981c:91bc:adbd:6703"/> <L P="51394" N="2002:c31d:e328:1000:c878:a88a:f1fb:f25d"/> <L P="51395" N="fe80::981c:91bc:adbd:6703%10"/> <L P="51396" N="192.168.1.36"/> </T> </C> </E> |
我注意到此邀请中只有本地IP地址。
我在这里做错什么了吗?甚至可以使用Windows桌面共享API在公共网络上的PC之间共享桌面?
如果没有,我有什么选择?其他然后设置VPN?
谢谢
您可以使用此:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | // you need to fix the port in order to know the port // that StartReverseConnectListener will use IRDPSRAPISessionProperties RdpProperties = Viewer.Properties as IRDPSRAPISessionProperties; RdpProperties["PortId"] = Myport; private string AddExIP(string viewerConnectionString) { TextReader tr = new StringReader(viewerConnectionString); XDocument doc = XDocument.Load(tr); // get external ip // From http://stackoverflow.com/a/16109156/2573450 string url ="http://checkip.dyndns.org"; System.Net.WebRequest req = System.Net.WebRequest.Create(url); System.Net.WebResponse resp = req.GetResponse(); System.IO.StreamReader sr = new System.IO.StreamReader(resp.GetResponseStream()); string response = sr.ReadToEnd().Trim(); string[] a = response.Split(':'); string a2 = a[1].Substring(1); string[] a3 = a2.Split('<'); string a4 = a3[0]; string ExternalIp = a4; // Add to connection string doc.Element("E").Element("C").Element("T").Add(new XElement("L", new XAttribute("P", MyportasString), new XAttribute("N", ExternalIp) )); return doc.ToString(); } string viewerConnString = Viewer.StartReverseConnectListener(SessionInvitation, Myname, Mypass); String NewConnectionString = AddExIP(viewerConnString); |
在桌面邀请中,我看到两个公共ipv6地址。 一个带有2001:使用ipv4 NAT遍历机制创建的Teredo IPv6地址,另一个带有2002:表示其6to4地址的前缀。
如果另一台计算机也具有公共IPv6地址,则此邀请应该有效。 在所有从Vista开始的Windows平台中,默认情况下都会初始化一个teredo或6to4 IPv6地址。 如果您的计算机位于对称NAT或代理之后,则6to4和Teredo地址将不可用。 请检查另一台机器是否具有ipv6地址。 如果有一个,它应该可以工作。
如果尝试连接到没有公共IP的PC,则需要使用某些端口转发规则配置防火墙或NAT。 然后,在邀请字符串中使用该公用IP(例如,路由器上的WAN IP)。