码农家园

关闭
导航

使用Windows桌面共享API的C#桌面共享


c#desktop-sharingrdpwindows

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)。

相关讨论

  • 如何在邀请字符串中使用公共IP。 该字符串由CreateInvitaion方法生成。 m_pRdpSession.Invitations.CreateInvitation(null," PresentationGroup"," 12345",1);
  • 看来没有办法通过API进行此操作。 您可以尝试手动替换邀请字符串中的IP地址。 但是,我自己还没有对此进行测试,从我在您链接的博客文章中看到的内容来看,它似乎无效。 总结当前情况,如果Viewer位于NAT之后,请像上面一样进行连接。 如果Sharer在NAT之后,请使用IRDPSRAPISharingSession :: ConnectToClient和查看器生成的连接字符串。 如果Viewer和Sharer都位于NAT之后,则没有受支持的解决方案。


Copyright ©  码农家园 联系:[email protected]