C / C ++检测网络类型

时间:2011-02-14 13:03:52

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

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

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

有没有人有其他建议?

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

[更新]

虽然尝试了一些不同的想法并查看下面的一些建议,但我认为我应该更新一些额外的信息,因为我认为不会有多少(如果不是全部)建议。

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

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

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

我发现哪一项工作是ping默认网关IP,当连接到交换机时会超时。这有点好,因为我可以减少ping的超时,所以它不会挂起很长时间但感觉有点像黑客,我当然会感谢任何更好的解决方案。

由于

3 个答案:

答案 0 :(得分:1)

就TCP / IP而言,WAN上没有LAN这样的东西。有一组非互联网可路由地址,如192.168.x.x和10.x.x.x,但这些地址有时被ISP使用,而不是IP地址。

最好的办法是在进行TCP / IP连接时使用异步API。 WIN32为此目的定义了一整套OVERLAPPED API。这样可以防止您的应用程序在等待远程连接时停止运转。

或者将套接字填充到另一个线程中,然后仅在操作完成时通知UI。

答案 1 :(得分:0)

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

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

如果您尝试使用某些网络服务的存在或不存在来确定您所连接的网络,则无法确定。例如,如果您未能映射该网络驱动器,您只知道网络驱动器不可用。您无法肯定地说您没有连接到公司LAN。如果使用ping,也是如此。特定机器的响应不足意味着机器没有响应。

答案 2 :(得分:0)

您可以通过各种方式来区分:

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有很多与网络相关的功能,您可以尝试创建更多指标。