GeirGrusom Skrevet 14. mai 2009 Del Skrevet 14. mai 2009 (endret) Hei Jeg holder på å lage et program for å tegne opp databaser, og i den forbindelse kunne det vært hendig å kunne liste opp alle databasene i nettverket. Jeg skal i all korthet lage et verktøy som Server Explorer i Visual Studio. Noen som har peiling på dette? Jeg kan tenke meg at det bare er snakk om en enkel Socket operasjon og se hva som svarer på hvilken port, men jeg vet ikke noe mer om saken. Endret 14. mai 2009 av GeirGrusom Lenke til kommentar
jossy Skrevet 14. mai 2009 Del Skrevet 14. mai 2009 HeiJeg holder på å lage et program for å tegne opp databaser, og i den forbindelse kunne det vært hendig å kunne liste opp alle databasene i nettverket. Jeg skal i all korthet lage et verktøy som Server Explorer i Visual Studio. Noen som har peiling på dette? Jeg kan tenke meg at det bare er snakk om en enkel Socket operasjon og se hva som svarer på hvilken port, men jeg vet ikke noe mer om saken. Hei. Jeg vil bare si at på www.stackoverflow.com får du garantert svar;) Lenke til kommentar
GeirGrusom Skrevet 14. mai 2009 Forfatter Del Skrevet 14. mai 2009 Hehe er registrert der, men jeg besøker aldri siden Lenke til kommentar
Glenn F. Henriksen Skrevet 15. mai 2009 Del Skrevet 15. mai 2009 Du kan få svar her og :-) http://www.codeproject.com/KB/database/loc...ql_servers.aspx Lenke til kommentar
GeirGrusom Skrevet 15. mai 2009 Forfatter Del Skrevet 15. mai 2009 (endret) Ah takker ^^ akkurat hva jeg lette etter edit: Hmmm snodig. Det funker forsåvidt, men jeg mottar 86 nuller fra SQL serveren... edit2: DUMME MEG!! Jeg laget et nytt buffer for å kopiere dat over i, så glemte jeg å kopiere data! DUH! edit3: Funker perfekt! takk for svar! Her er min ferdige kode hvis noen andre er interessert i dette. Klikk for å se/fjerne innholdet nedenfor public class DatabaseInfo { protected string m_server_name; protected string m_instance_name; protected IPHostEntry m_host; protected int m_tcp_port; public string ServerName { get { return m_server_name; } } public string Instance { get { return m_instance_name; } } public IPHostEntry Host { get { return m_host; } } public int TcpPort { get { return m_tcp_port; } } public DatabaseInfo(string server_name, string instance, int port) { m_server_name = server_name; m_instance_name = instance; m_tcp_port = port; m_host = Dns.GetHostEntry(m_server_name); } } public delegate void FoundDataBase(DatabaseInfo db); public delegate void SearchEnded(bool success); public class MSSQLDatabaseFinder { private System.Threading.Thread th; private FoundDataBase m_callback; private SearchEnded m_ended; private int m_timeout; public void BeginFind(FoundDataBase callback, SearchEnded end, int timeout) { m_callback = callback; m_ended = end; m_timeout = timeout; th = new System.Threading.Thread(new System.Threading.ThreadStart(ThreadProc)); th.Start(); } public void Find(FoundDataBase callback, SearchEnded end, int timeout) { m_callback = callback; m_ended = end; m_timeout = timeout; ThreadProc(); } private DatabaseInfo ParsePackage(string pack) { int index = pack.IndexOf(''); if (index > 0) pack = pack.Substring(index + 1); var m_info = new Dictionary<string,string>(); string[] items = pack.Split(';'); for (int i = 0; i < items.Length; i += 2) { m_info.Add(items[i], items[i + 1]); } string server_name; string instance_name; string port; int new_port = -1; m_info.TryGetValue("ServerName", out server_name); m_info.TryGetValue("InstanceName", out instance_name); if (m_info.TryGetValue("tcp", out port)) new_port = int.Parse(port); return new DatabaseInfo(server_name, instance_name, new_port); } private void ThreadProc() { var sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); sock.EnableBroadcast = true; sock.ReceiveTimeout = m_timeout; sock.SendTo ( new byte[] { 0x02 }, new IPEndPoint(IPAddress.Broadcast, 1434) ); var success = false; var data_buffer = new byte[256]; try { // Loop until timeout while (true) { int len = sock.Receive(data_buffer); if (len > 0) { success = true; var new_data = new byte[len]; Array.Copy(data_buffer, new_data, len); string info = Encoding.ASCII.GetString(new_data); m_callback(ParsePackage(info)); } } } catch (SocketException) { // Search has ended in timout probably. } if (m_ended != null) m_ended(success); th = null; } } Her er hvordan jeg bruker BeginFind funksjonen i mitt program: finder.BeginFind( callback => { Invoke(new AddDatabaseProc(AddDatabase), callback); }, success => { if (!success) MessageBox.Show("No databases found"); }, 3000); Endret 15. mai 2009 av GeirGrusom Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå