Avatar billede hrc Mester
30. juli 2009 - 09:51 Der er 19 kommentarer og
1 løsning

Detektere om maskinen er på farten eller tilkoblet netværket

Kunderne har bærbare der skal med dem rundt på dagens opgaver. Når maskinen frakobles netværket skal programmet bruge den lokale database (der replikeres fra "moder"-databasen).

Hvad er den bedste måde at afgøre om maskinen er på (domæne)-netværket eller frakoblet?

Jeg overvejede at tjekke IP-nummeret. Er det 127.0.0.1 er brugeren ude af huset. Men hvad sker der når de sætter deres 3-modem på og går på Internettet? Så ryger den løsning, ikke?

En anden måde er at pinge moder-serveren. For programmet betyder det 5s timeout på maskiner der er ude at køre. Det vil jeg gerne undgå.

En tredje måde er at brugeren angiver at han kører lokalt - det vil jeg også gerne undgå.
Avatar billede hrc Mester
30. juli 2009 - 10:42 #1
Avatar billede nca Juniormester
30. juli 2009 - 10:50 #2
Et svar på 127.0.0.1 fortæller blot om IP-protokollen er korrekt sat op.
Hvis du kender netværkets IP scope, kan du checke om om maskinen har fået en "hjemmeadresse", så ved du, at den et på firmaets netværk.
Hvis maskinerne også kobler på det trådløse, skal du også checke denne netværks adresse.
Avatar billede hrc Mester
30. juli 2009 - 11:10 #3
nca: Jeg går som skrevet efter domæne-løsningen. Hvis maskinen er på et domæne, forsøger programmet at forbinde til databasen der. Hvis dette fejler bliver brugeren underrettet og får muligheden for at køre på den lokale database. I værste fald kommer der et timeout på p.t. 5s. Vil gerne undgå at der skal sættes for meget op mht. angivelse af IP-scope og andet.
Avatar billede djeclemen Nybegynder
30. juli 2009 - 11:19 #4
Det du har smidt af link, tjekker jo bare om computeren er tilmeldt et domaine, og ikke om den er online eller offline.
Avatar billede hrc Mester
30. juli 2009 - 11:25 #5
djeclemen: Du har ret - det ellers så så lovende ud, at jeg lukkede spørgsmålet prompte.
Avatar billede js_delphi Nybegynder
30. juli 2009 - 14:38 #6
Hej hrc,

jeg fandt denne engang, men er ikke sikker paa, den kan bruges i dit tilfaelde:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, WinSock, wininet;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function LocalIP : String;
type
  TArrayPInAddr = array [0..10] of PInAddr;
  PArrayPInAddr = ^ TArrayPInAddr;
  var
  phe      : PHostEnt;
  pptr    : PArrayPInAddr;
  Buffer  : array [0..63] of char;
  i        : integer;
  GInitData: TWSADATA;
begin
  WSAStartup($101, GInitData);
  result := '\';
  GetHostName(Buffer, sizeof(Buffer));
  phe := GetHostByName(Buffer);
  if phe=nil then
  begin
    exit
  end;
  pptr := PArrayPInAddr(phe^.h_addr_list);
  i := 0;
  while pptr^[i]<>nil do
  begin
    result := StrPas(inet_ntoa(pptr^[i]^));
    Inc(i);
  end;
  WSACleanup;
end;

Function ConnectionKind :boolean;
var
  flags: dword;
begin
  Result := InternetGetConnectedState(@flags, 0);
  if Result then
  begin
    if (flags and INTERNET_CONNECTION_LAN) = INTERNET_CONNECTION_LAN then
    begin
      Result := True;
    end
    else
    begin
      Result := False;
    end

  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if  ConnectionKind = true then
    begin
      if LocalIP = '127.0.0.1\' then
        begin
          Showmessage('der er ikke netwærk\')
        end
      else
        begin
          ShowMessage('der er netwærk\');
      end
    end
  else
    begin
      Showmessage('der er ikke netwærk\')
  end;
end;

end.
Avatar billede hrc Mester
30. juli 2009 - 14:57 #7
js_delphi: Tak. Umiddelbart nej, men har dog gaflet ConnectionKind og omdøbt den HasInternetConnection (og skrevet den lidt om (bruger short boolean evaluation)):

uses
  WinSock, WinINet;

function HasInternetConnection: boolean;
var
  flags: dword;
begin
  Result := InternetGetConnectedState(@flags, 0) and
            ((flags and INTERNET_CONNECTION_LAN) = INTERNET_CONNECTION_LAN);
end;


P.s. Kører du virkelig 250km/t når du kan?
Avatar billede nca Juniormester
30. juli 2009 - 16:40 #8
Jeg synes at spørgsmålet har bevæget sig væk fra det oprindelige ;-)
Det er vel ikke et spørgsmål om maskinen er tilmeldt et domæne eller om der er Internetforbindelse?
Jeg ved ikke hvilken ping-kommando du bruger, men på den "almindelige" ping-kommando kan man bestemme hvor mange ekkoanmodninger, der skal sendes og hvor mange millisekunder, der skal være mellem hver ekkoanmodning.
Sætter du antallet til 2 og timeout til 2, når du pinger hovedserveren, går der omkring 1 sekund, før du kender status på din maskine.
Smider du en meddelelse på skærmen samtidig, hvor du fortæller at netværkstilslutningen kontrolleres, tror jeg at alle bliver tilfredse.
Avatar billede hrc Mester
30. juli 2009 - 17:30 #9
nca: Det er korrekt at Ping ville afgøre sagen. Problemet er bare, at med 5s timeout (som jeg anser for max) kan det stadig risikeres at programmet dumper en eksisterende netværksserver (nogle kører programmet via VPN eller Citrix) og prøver at køre lokalt.

Derfor har vi besluttet at Ping ikke dur'.
Avatar billede mbsnet Nybegynder
30. juli 2009 - 22:13 #10
Kan i eventuelt bruge windows fildeling ved at se om der er forbindelse til stien \\computernavn\c$ eller lign
Avatar billede nca Juniormester
31. juli 2009 - 09:18 #11
Hvis maskinen kører med dynamisk IP-adresser, kan du bare aflæse maskinens IP-adresse.
Kan det ikke du?
Avatar billede hrc Mester
31. juli 2009 - 09:55 #12
Maskinerne kører 99% sikkert via DHCP. Hvis netværket er væk får de IP 127.0.0.1. At tjekke for denne adresse er løsningen jeg også har fundet på Internettet. Sandsynligheden er desværre stor for, at brugeren har et trådløst modem med - og så har maskinen et IP-nummer igen - bare ikke et med adgang til databasen.

Skal undersøge hvad der sker når man har med faste IP-numre at gøre. Tror stadig at IP-nummeret bliver 127.0.0.1 - undersøges skal det dog.

Hvis brugeren logger på Internettet og starter programmet vil det tro at der er forbindelse til databasen og forsøge at få adgang. Her kommer der p.t. 5s timeout hvorefter den falder tilbage til den lokale database.

Jeg kunne publicere databasen over Internettet, med dette er kunden ikke interesseret i. Data skal ned på den bærbare og replikeres tilbage når brugeren logger på hjemme. Desuden vil det komplicere replikeringen at noget er blevet rettet via nettet og andet skal kopieres fra den lokale database.
Avatar billede nca Juniormester
31. juli 2009 - 10:26 #13
Jeg tror ikke du har ret mht. 127.0.0.1
Den adresse vil altid kunne pinges på en maskine, blot IP-protokollen er installeret.
Hvis maskinen bruger DHCP og der ikke er nogen DHCP-server til rådighed fx. pga. manglende netværksforbindelse, så vil maskinen få en 169.254.x.x adresse.
Så hvis du kontrollerer om maskinen har en adresse, der ligger i virksomhedens scope, vil du vide om den er på netværket hjemme i firmaet eller ej.
Om der er Internetforbindelse eller ej er vel ligegyldig i denne sammenhæng.
Avatar billede hrc Mester
31. juli 2009 - 11:25 #14
nca: Det betyder ikke noget. Hvis jeg henter alle IP-numrene min maskine har (VmWare, flere NIC osv) vha. denne funktion,

function GetLocalIPs: TStringList;
const
  BufferSize = 64;
type
  TaPInAddr = array[0..10] of PInAddr;
  PaPInAddr = ^TaPInAddr;
var
  i: integer;
  phe: PHostEnt;
  pptr: PaPInAddr;
  GInitData: TWSAData;
  Buffer: PAnsiChar;
begin
  Result := TStringList.Create;

  WSAStartup($101, GInitData);
  try
    GetMem(Buffer,BufferSize);
    try
      // Get computer name
      GetHostName(Buffer, BufferSize);
      phe := GetHostByName(buffer);

      if not assigned(phe) then
        Exit;

      // Get IP-addresses
      i := 0;
      pPtr := PaPInAddr(phe^.h_addr_list);
      while assigned(pPtr^[i]) do
      begin
        result.Add(string(inet_ntoa(pptr^[i]^)));
        inc(i);
      end;
    finally
      FreeMem(Buffer);
    end;
  finally
    WSACleanup;
  end;
end;


så er 127.0.0.1 ikke med når den er forbundet. Når frakoblet er den. Det uanset om IP er statisk eller via DHCP.

Det er rigtignok ligegyldigt om det er Internet eller hvad. Kardinalpunktet er om den har adressen 127.0.0.1.
Avatar billede hugopedersen Nybegynder
03. august 2009 - 12:53 #15
hrc> hvis jeg prøver din kode så får jeg ikke 127.0.0.1 med når jeg piller netværkskablet ud - jeg får de 2 192.168 adresser min VMWare fidus bruger og ikke andet.

Windows XP 64
Avatar billede hrc Mester
04. august 2009 - 08:19 #16
hugo: Det er korrekt, tak. Bliver nødt til at lade det være. Sandsynligheden for, at kundernes bærbare har flere IP-adresser, er meget lille - og nu er jeg/vi klar over svagheden i konceptet.
Avatar billede hugopedersen Nybegynder
04. august 2009 - 08:26 #17
Sandsynligheden for at en bruger finder en 'svaghed' i et program = sandsynligheden for at konen finder ud af hvis man kigger efter andre kvinder på gaden :-)

Hvordan reagerer den hvis man har 2 netkort? Der er jo mange laptops med et 'rigtigt' og et wireless
Avatar billede hrc Mester
04. august 2009 - 12:36 #18
Det ene netkort plejer at udelukke det andet. Det gør det i alt fald på de bærbare jeg har haft (i øvrigt samme som de maskiner vores kunde render rundt med (Lenovo'er hvor <fn> og <ctrl> tasterne af en eller anden hjernelam grund er placeret forkert)).
Avatar billede hugopedersen Nybegynder
04. august 2009 - 13:46 #19
'Det ene netkort plejer at udelukke det andet' - den forstod jeg ikke rigtig. Du kan da sagtens bruge begge netkort på en gang.
Avatar billede hrc Mester
06. august 2009 - 19:42 #20
Jeg kan ikke. Når den trådløse er forbundet så er der ikke hul igennem på den kablede. Det har sikkert noget at gøre med at afsenderen (routeren) er den samme. Igen vil jeg påstå at sandsynligheden for konen opdager vi kigger efter andre kvinder er større (men overrasket bliver hun nok ikke) end at de kunder jeg snakker om, kører med mere end et netkort = IP.

Løsningen er den bedste jeg har kunne finde - og den bliver indtil det viser sig at det må ændres.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester