2

我使用 Windows 桌面共享 API 编写了一个用于桌面共享的简单 C# 应用程序

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。我的主机应用程序生成的邀请看起来像这样

<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?谢谢

4

4 回答 4

1

你可以使用这个:

// 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);
于 2015-08-07T08:29:36.770 回答
0

在桌面邀请中,我看到两个公共 ipv6 地址。一个是 2001:它的 teredo IPv6 地址是使用 ipv4 NAT 遍历机制创建的,另一个是 2002:前缀表示它的 6to4 地址。如果另一台机器也有公共 IPv6 地址,则此邀请应该有效。在从 vista 开始的所有 windows 平台中,默认初始化一个 teredo 或 6to4 IPv6 地址。如果您的机器位于对称 NAT 后面或代理后面,则 6to4 和 teredo 地址将不可用。请检查另一台机器是否有ipv6地址。如果它有一个,它应该可以工作。

于 2014-07-18T12:14:24.273 回答
0

如果您尝试连接到没有公共 IP 的 PC,则需要使用一些端口转发规则配置防火墙或 NAT。然后,在您的邀请字符串中使用该公共 IP(例如路由器上的 WAN IP)。

于 2014-07-18T12:05:26.277 回答
0

您可以通过实现IRDPSRAPITransportStream. IRDPSRAPISharingSession2::ConnectUsingTransportStream使用该方法将您的传输传递给共享者,并使用IRDPSRAPIViewer::get_Propertieswith property传递给客户端"SetNetworkStream"

完整示例可在https://github.com/mgaffigan/RemoteAssistanceSample获得

于 2022-01-04T21:11:46.433 回答