互联网连接状态是什么意思?

时间:2009-07-23 20:36:41

标签: delphi

互联网连接状态是什么意思?

我无法弄清楚哪个状态代表路由器,3号?

4是什么意思?

uses
  WinInet;

const
  MODEM = 1;
  LAN = 2;
  PROXY = 4;
  BUSY = 8;

function GetConnectionKind(var strKind: string): Boolean;
var
  flags: DWORD;
begin
  strKind := '';
  Result := InternetGetConnectedState(@flags, 0);
  if Result then
  begin
    if (flags and MODEM) = MODEM then strKind := 'Modem';
    if (flags and LAN) = LAN then strKind := 'LAN';
    if (flags and PROXY) = PROXY then strKind := 'Proxy';
    if (flags and BUSY) = BUSY then strKind := 'Modem Busy';
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  strKind: string;
begin
  if GetConnectionKind(strKind) then
    ShowMessage(strKind);
end;

3 个答案:

答案 0 :(得分:6)

[InternetGetConnectedState](http://msdn.microsoft.com/en-us/library/aa384702(VS.85%29.aspx)在第一个参数中返回一个位掩码,如下所示:

76543210  <-- bit numbers
 || ||||
 || |||+- INTERNET_CONNECTION_MODEM
 || ||+-- INTERNET_CONNECTION_LAN
 || |+--- INTERNET_CONNECTION_PROXY
 || +---- INTERNET_CONNECTION_MODEM_BUSY (No longer used)
 |+------ INTERNET_CONNECTION_OFFLINE
 +------- INTERNET_CONNECTION_CONFIGURED

如果设置了给定位,则连接属于该类型。所以,如果位nr。设置为2,您通过代理连接。

此外,该函数返回TRUE / FALSE值,表示您是否已连接到互联网。

您的代码中的值1,2,4,8对应于这些位的十进制值,从右侧开始计算。

基本上,代码依次检查每个位,并将strKind变量设置为指示连接性质的文本。

你问的是“哪个是路由器?3?”,我认为你的意思是“我怎么知道我的连接是通过路由器的?”。我认为这与局域网连接是一样的,可能是局域网有一个通过互联网访问互联网的桥梁。

答案 1 :(得分:6)

代码1,2,4,8代表位掩码。我通常更喜欢总是使用十六进制的位掩码来避免任何混淆,因为模式在半字节(4个二进制位的集合)中继续存在,所以它很容易记住。

HEX       BINARY       DEC
$01       00000001       1
$02       00000010       2
$04       00000100       4
$08       00001000       8
$10       00010000      16
$20       00100000      32
$40       01000000      64
$80       10000000     128

如果您想一次检查两个值,可以将它们组合在一起,例如$ 01或$ 02 = $ 03(二进制00000011)。因此,3将是一个调制解调器和一个局域网。

查看是否设置了某些内容的常见做法是将其与掩码进行对比。例如,如果我的数字是3,并且i“和”这个带有$ 02,那么结果是$ 02,因为掩码和值的位都被设置了。如果我的数字是4,并且我“和”这个带有$ 02,那么结果是$ 00,因为掩码和值的位都没有设置。

当然,这并没有回答我认为你真正的问题。仅通过检查此掩码就无法确定路由器。此掩码只是告诉您是通过调制解调器(也称为拨号)或网络适配器连接。路由器将超出网络适配器,并且需要进一步分析网络以准确确定。

答案 2 :(得分:0)

常量值是标志,表示两件事:(1)你不能有“3”值;(2)你可以在“flags”结果中有多个值。例如,对于结果9(二进制1001),第一次和最后一次检查都是真的。

有关结果含义的详细信息,请查看InternetGetConnectedState的MSDN参考。