使用Windows桌面共享API的c#桌面共享
本文关键字:桌面 共享 API 使用 Windows | 更新日期: 2023-09-27 18:13:41
我用Windows桌面共享API编写了一个简单的c#桌面共享应用程序
http://msdn.microsoft.com/en-us/library/bb968809.aspxhttp://blogs.msdn.com/b/rds/archive/2007/03/08/windows-desktop-sharing-api.aspx
我的大部分应用程序代码都是基于微软的博客文章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。我的主机应用程序生成的邀请看起来像这样
<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?谢谢你
你可以这样写:
// 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);
如果你试图连接到一台没有公共IP的PC,你将需要配置防火墙或NAT与一些端口转发规则。然后,在邀请字符串中使用该公共IP(例如路由器上的WAN IP)。
在桌面邀请中,我看到两个公共ipv6地址。一个与2001:它的teredo IPv6地址创建使用ipv4 NAT遍历机制& &;另一个是2002:前缀,表示它的6to4地址。如果另一台机器也有一个公共IPv6地址,则此邀请应该有效。在从vista开始的所有windows平台中,默认初始化teredo或6to4 IPv6地址。6 to4,如果您的计算机位于对称NAT后面或代理后面,那么teredo地址将不可用。请检查另一台机器是否有ipv6地址。
您可以通过实现IRDPSRAPITransportStream
在任意传输上对数据进行隧道化。使用IRDPSRAPISharingSession2::ConnectUsingTransportStream
方法将您的传输传递给共享器,并使用具有"SetNetworkStream"
属性的IRDPSRAPIViewer::get_Properties
传递给客户端。
完整的示例可在https://github.com/mgaffigan/RemoteAssistanceSample