02. juli 2005 - 21:18Der 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....?
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å
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
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"?
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);
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.
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.
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
ja, det er rigtigt.... men det ville vaere nemmere hvis variablen var der allerede :-)
Naa, mange takker for hjaelpen lifo.
Synes godt om
Ny brugerNybegynder
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.