【问题标题】:Find out if it is the local machine判断是否是本地机器
【发布时间】:2011-01-07 11:36:47
【问题描述】:

我的应用程序中有一个实现,只有当我的可执行文件与数据库位于同一台机器上时才能运行。

我确实有一个包含服务器地址的连接字符串。如果是本地机器,可能是 127.0.0.1、localhost 或其他东西(例如别名)。

有没有办法断言测试我的连接字符串中的服务器是否恰好是本地机器?

【问题讨论】:

  • 您好,Ricardo,您可以检查应用程序何时尝试连接数据库,如果目标 IP 与本地主机相同,即 192.168.10.20、10.10.12.1 等,您明白了。
  • 如果在 db 不是本地的情况下运行这段代码会发生什么?它崩溃了吗?或者它暴露了你不想暴露的东西?还是……?
  • @Martinho Fernandes:运行需要很长时间。如果是本地则需要 2-3 分钟,如果不是则需要 2-3 小时

标签: windows delphi delphi-7 firebird


【解决方案1】:

强制local transport protocol(参见connection string FAQ)将强制进行本地连接。

请注意,在 FireBird 2.0 中,local transport protocol 的底层实现更改为 XNET
不过,您应该不会注意到任何差异。

注意:对于 InterBase 6.0 及更低版本,请勿尝试混合使用 TCP/IPlocal transport protocol,因为其中的错误可能会导致数据损坏。
将这两者与 Firebird 混合应该没问题。

--杰罗恩

【讨论】:

    【解决方案2】:

    只需将连接中的数据库 IP 地址设置为 127.0.0.1。如果失败,则不是本地计算机。

    注意:如果您在托管该数据库 + 数据库的计算机上执行代码未正确配置,这也可能会失败...

    【讨论】:

    • 确实如此。如果你的意思是你的应用只应该在连接到本地数据库时运行,为什么服务器地址是可配置的?
    • 简单的解决方法:ssh someotherhost -L 3050:localhost:3050 将所有流量从 127.0.0.1:3050 转发到 someotherhost:3050 - 但服务器似乎(并且可以访问)在 localhost 上。我不确定这是否可以避免,因为还有很多其他方法可以进行这种隧道。
    • @David Heffernan 我没有说我的洞应用程序应该只在本地运行,我的应用程序中有一个实现应该只在本地可用。为确保问题不会模棱两可,我将对其进行编辑。
    • @Ricardo 当您获得“我的应用程序中应该仅在本地可用的一个实现”时,始终连接到环回。
    • 不要连接回环,因为它可以重新路由;使用本地传输协议。
    【解决方案3】:

    对于完全不同的方法:

    在数据库中创建两个存储过程。

    • 返回运行数据库的机器本地文本文件的(可配置的)完整文件路径。
    • 将一些传入的文本写入此文件。

    在您的应用中:

    • 调用返回文件名的存储过程
    • 在运行可执行文件的机器上删除该文件
    • 调用写入文件的存储过程并为其提供一些唯一的文本(最好每次调用存储过程都是唯一的)
    • 检查您是否可以从本地位置读取该文件,并且它是否包含您提供给存储过程的文本

    请注意驱动器映射(因此请检查返回文件名中的驱动器是否是本地驱动器而不是映射驱动器)和 unc 文件名(检查机器名称是否与本地机器的名称相同)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-07
      • 2012-12-31
      • 1970-01-01
      • 1970-01-01
      • 2022-11-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多