【问题标题】:C/C++ detect network typeC/C++ 检测网络类型
【发布时间】:2011-02-14 13:03:52
【问题描述】:

我需要编写一个 win32 c/c++ 应用程序,它能够确定运行它的 PC 是否连接到 2 个网络之一。第一个网络是公司 LAN(没有互联网连接),第二个网络是一个独立的交换机,连接了一台 PC(运行程序的 PC)。

我对网络编程还很陌生,但到目前为止,我已经尝试测试是否可以映射我们 LAN 上的网络驱动器。如果 PC 连接到 LAN,则此方法工作正常,驱动器映射成功,因此 LAN 检测成功。但是,如果 PC 连接到交换机,这会导致非常长的超时,这是不合适的,因为它会延迟程序以至于使其无法使用。

有人有其他建议吗?

我在 VS 6.0 中使用 c/c++

[更新]

在尝试一些不同的想法并查看下面的一些建议时,我认为我应该更新一些额外的信息,尽可能多的(如果不是全部)我认为不会奏效的建议。

(1) 上述局域网完全没有外部连接,完全隔离,无法解析外部DNS或ping网站。

(2) 主机名、MAC 地址、IP、默认网关、子网等(基本上您在 ipconfig -all 中看到的所有内容)都是手动配置的(不是从路由器动态配置的),因此检查任何这些设置都会返回相同无论是连接到局域网还是交换机。

(3) 由于第 (2) 点,任何与交换机通信的尝试似乎都不成功,事实上几乎所有网络命令(ping、arp 等)似乎都失败了 - 我认为是由于机器试图连接当它不存在时到 LAN :-(

我发现一个可行的方法是 ping 连接到交换机时超时的默认网关 IP。这没关系,因为我可以减少 ping 的超时,因此它不仅会挂起很长时间,而且感觉有点像 hack,我当然会感谢任何更好的解决方案。

谢谢

【问题讨论】:

  • 与问题无关,但是:您真的使用的是 1998 年的旧编译器?
  • 所以你有两个不同的网络,它们的配置相同,所以软件无法区分,现在你想用软件来区分。
  • @akira 不幸的是,是的。这是遗留代码,由于软件的复杂性和我们的可测试性限制,公司不愿意更新编译器。如果他们这样做,将导致必须进行完整的系统测试,这需要 3 人的团队超过 6 周的时间才能完成。

标签: c++ c winapi visual-c++ network-programming


【解决方案1】:

就 TCP/IP 而言,没有所谓的 LAN on WAN。有一组非 Internet 可路由地址,例如 192.168.x.x 和 10.x.x.x,但这些地址有时会被缺少 IP 地址的 ISP 使用。

最好的办法是在建立 TCP/IP 连接时使用异步 API。为此,WIN32 定义了一整套 OVERLAPPED API。这将防止您的应用程序在等待远程连接时停止。

或者将套接字内容放入另一个线程,然后仅在操作完成时通知 UI。

【讨论】:

  • 我不确定您所说的 LAN on WAN 评论是什么意思。为了澄清我的描述,我的意思是我们的 LAN 是孤立的,所以我无法执行诸如 ping Google 之类的操作(这似乎是我搜索网络检测问题的论坛上常用的解决方案)。此外,将套接字内容放在另一个线程中将不起作用,因为应用程序在知道它连接到哪个网络之前无法运行,因此它必须以任何方式等待。
【解决方案2】:

我会首先尝试使用本地可用的信息(即来自您的计算机)来区分这两者。 ipconfig /all 的输出是否因您连接的网络而异?如果是这样,请尽可能利用这种差异。

是否可以获取独立交换机的 MAC 地址?控制公司局域网的交换机?这将是一个肯定的方式来告诉。除非有人克隆了 MAC 地址。

如果您尝试使用某些网络服务的存在或不存在来确定您连接到哪个网络,您永远无法确定。例如,如果您未能映射该网络驱动器,那么您只知道该网络驱动器不可用。你不能肯定地说你没有连接到公司局域网。如果您使用 ping,也是如此。特定机器没有响应仅表示该机器没有响应。

【讨论】:

  • 其中一些建议不起作用(请参阅更新的问题)虽然我知道独立交换机的 MAC 地址,但我该如何使用它?对不起,我是菜鸟,非常感谢您的帮助!
  • @Gavimoss:Windows arp 命令将显示连接到特定 IP 地址的机器的 MAC 地址。即arp -a 10.77.76.1 将显示IP 地址和MAC 地址。您可以通过 IP 帮助程序 API 在程序中访问该数据。 msdn.microsoft.com/en-us/library/aa366073(v=VS.85).aspx 如果您知道独立交换机的 MAC 地址,则可以将其与 arp(或您调用的 IP 助手函数)返回的值进行比较。
  • 对于延迟接受深表歉意,这是一个我刚刚回来完成的附带项目,您的解决方案完美运行 - 谢谢!
【解决方案3】:

您可以查看各种不同的东西来区分:

DNS domain name (GetComputerNameEx)
MAC address of gateway (ping it, then GetIpNetTable)
Routing table(do you have a gateway and default route on the company LAN)
WNet discovered network resources (WNetOpenEnum, WNetEnumResource)
Ability to resolve external hostnames (try a 5-10 names like www.google.com, www.microsoft.com and so on, if one resolves you should have internet)

如果测试失败,您必须确定有多少指标“足够”来决定您在一个或另一个 LAN 上。然后不断重试,直到有明确的结果。

http://msdn.microsoft.com/en-us/library/aa366071%28v=VS.85%29.aspx 有很多与网络相关的功能,您可以尝试创建更多指标。

【讨论】:

  • 我刚刚更新了我的问题 - 请记住新信息,以上任何方法仍然有效吗?
猜你喜欢
  • 2019-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多