Avatar billede Lasse Novice
02. juli 2005 - 21:18 Der er 17 kommentarer og
1 løsning

Broadcast og svar

Jeg har en masse servere paa et lokal net. Som klient vil jeg gerne vide hvilke der eksisterer (ligesom naar man proever at finde SQL servere paa ens lokal net). Hvordan goeres dette?

Jeg har selv leget med at broadcaste en UDP pakke, og derfra....?
Avatar billede lifo Nybegynder
02. juli 2005 - 23:22 #1
hvilken slags servere snakker du om ?  selve computerne, http, ftp, andet ??

nok lige meget hvad det er så er det nok noget med at lave en løkke som løber alle (254) addresserne igennem og forsøger at connecte til det port som du ved at serveren lytter på
Avatar billede skwat Praktikant
03. juli 2005 - 17:17 #2
Er det alle servere der køre en app. du selv har lavet? Eller vil du bare tjekke om IP'en virker hen til den givne maskine?
Avatar billede Lasse Novice
06. juli 2005 - 18:04 #3
Det er en server jeg selv har lavet - port 11001.

Lifo>> Ren brute force metode. Mit problem er at netvaerket sagtens kan vaere stoerrere (subnetmask == 255.255.120.0).

Jeg skal saadanne set bare kopiere det de goer i MSSQL klienterne og SQL serveren.
Avatar billede lifo Nybegynder
06. juli 2005 - 18:38 #4
vel nu ved jeg ikke hvordan sql server laver det
og ved heller ikke hvad for en slags server du har

men den måde jeg har plejer at gøre det er
serveren lytter på et udp port efter pakker checker om pakken er en forspørgsel
og det skal helst køre i en tråd for sig selv

public void lytEfterKliente()
{
  Socket lytteSocket = new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);
  try
    {
      IPEndPoint iep = new IPEndPoint(IPAddress.Any,9934);
      lytteSocket.Bind(iep);
      while(true)
      {
        EndPoint ep = (EndPoint)iep;
        byte[] data = new byte[1024];
        int recv = lytteSocket.ReceiveFrom(data,ref ep);
        string stringData = Encoding.ASCII.GetString(data,0,recv);
    if(stringData.StartsWith("hvor er du"))
    {
          sendSvar();
    }
      }
      }catch(Exception ex)
        {
      MessageBox.Show("Exception i lytEfterKliente()\n\n"+ex,"Exception");
    }
        finally
        {
          lytteSocket.Close();
        }
}


og og send svar

public void sendSvar()
{
  try
  {
    Socket sendSocket = new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);
    IPEndPoint iep = new IPEndPoint(IPAddress.Broadcast,9933);
    string hostName = Dns.GetHostName();
    byte[] data = Encoding.ASCII.GetBytes("jeg er paa --->"+hostName+":"+port);
    sendSocket.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.Broadcast,1);
    sendSocket.SendTo(data,iep);
    sendSocket.Close();
  }
    catch(Exception ex)
    {
    MessageBox.Show(null,"Exception i sendSvar() \n\n"+ex,"Exception");
    }
}

på klienten skal du så have det samme bare at du sender først og så lytter efter svar
og bytter strengene om som du sender og lytter efter
Avatar billede Lasse Novice
06. juli 2005 - 19:22 #5
Det er noget i den retning jeg soeger. Jeg har selv undersoegt sagen vha packet snifning og det viser sig at SQL serveren bruger nogenlunde samme fremgangsmaade.

En lille ting jeg ville goere forskellig (fif fra SQL serveren) ville vaere at serveren kun sender til klienten der foerespoerger og ikke broadcaster. Det medfoerer selvfoelgelig at klienten til at starte med sender dens IP addresse med i pakken.

En anden ting jeg ser i SQL serveren er at hvis f.eks. klienten sender en UDP pakke ud paa port 2026 til port 11001, saa sender serveren tilbage paa samme porte??? Dvs. serveren sender tilbage paa port 2026 fra port 11001. Hvordan kan man "goere dette i .NET"?
Avatar billede lifo Nybegynder
06. juli 2005 - 19:32 #6
modtage og sende er to forskellige ting som ikke henger sammen når vi snakker udp
i eksemplet ovenfor kan du også se at jeg modtager og sender på to forskellige porte

om du kun vil sende svar til den som spørger så kan du bare bruge addressen som er i ep variablen  det er senderens addresse
og så skifte
IPEndPoint iep = new IPEndPoint(IPAddress.Broadcast,9933);
til
IPEndPoint iep = new IPEndPoint(variabelSomHarIP,9933);
Avatar billede Lasse Novice
06. juli 2005 - 20:18 #7
Jeg ser problemet med sende modtage i UDP.

Jeg vil helt sikker bruge din loesning, saa med et svar...

Ikke desto mindre saa bruger SQL serveren den foeromtalte metode... hvordan, who knows?
Avatar billede lifo Nybegynder
06. juli 2005 - 20:34 #8
svar
Avatar billede skwat Praktikant
06. juli 2005 - 22:16 #9
Er det ikke bare et udtryk for at SQL serveren svare i samme socket som den modtager fra. (Det kan man godt, hvis det er det lifo siger man ikke kan)
Avatar billede Lasse Novice
07. juli 2005 - 00:03 #10
skwat >> ogsaa selvom det er UDP? Og hvis ja... hvordan kan dette goeres i .NET
Avatar billede lifo Nybegynder
07. juli 2005 - 09:52 #11
ja du kan sende og modtage på samme port med UDP men så kan du ikke lytte hele tiden
foreksempel

lyt efter forespørgsler på port x
når en forespørgsel kommer send et svar på port x
og begynd så at lytte igen på port x

jeg kan lave et eksempel om du vil
Avatar billede skwat Praktikant
07. juli 2005 - 16:08 #12
lifo, det problem er det ikke mere knyttet til noget buzywait end UDP.
Avatar billede Lasse Novice
07. juli 2005 - 16:53 #13
Ikke at jeg kan supportere det med noget kode, men kigger man paa SetSocketOption og ReuseAddress saa tror jeg at man kan baade lytte og sende paa samme udp port.

Lifo>> Det scenario du beskriver vil dog ogsaa kunne bruges i mit tilfaelde. Det eneste jeg ikke lige kan se er hvordan man finder ud af hvilken port senderen har sendt fra. Hvis man i modtageren kigger i RemoteEndPoint bliver der smidt en exception. Og man kan ikke sende det fra senderen eftersom det ikke er tilgaengeligt.
Avatar billede lifo Nybegynder
07. juli 2005 - 17:49 #14
i mit eksempel længr oppe hvor jeg bruger  lytteSocket.ReceiveFrom(data,ref ep);

bliver senderens ip og port lagt ind i ep variablen
Avatar billede Lasse Novice
07. juli 2005 - 20:43 #15
Er det muligt at faa at vide hvilken adapter IPaddress et receive kald kommer fra? (i tilfaelde af at man har flere adapters paa computeren).
Avatar billede Lasse Novice
07. juli 2005 - 20:46 #16
hmm, lidt utydligt...

Er det muligt at faa ipaddressen paa den netvaerkskort der receiver data(ikke ipaddressen fra remote maskinen, men lokal maskinen)? Jeg har flere Netwaerkskort, og kunne godt taenke mig at vide hvilken en der modtog dataen.
Avatar billede lifo Nybegynder
08. juli 2005 - 00:32 #17
har lige været ude og set War og the worlds  ok film

men det der med at se hvilkeet netkort det kommer fra ved jeg ikke helt
MEN
om du har flere netkort har du også sat dit netværk rigtigt op så at du kan se på ip adressen hvor det kommer fra
Avatar billede Lasse Novice
08. juli 2005 - 16:37 #18
ja, det er rigtigt.... men det ville vaere nemmere hvis variablen var der allerede :-)

Naa, mange takker for hjaelpen lifo.
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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