Gå til innhold

Anbefalte innlegg

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 av GeirGrusom
Lenke til kommentar
Videoannonse
Annonse
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.

Hei.

Jeg vil bare si at på www.stackoverflow.com får du garantert svar;)

Lenke til kommentar

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 av GeirGrusom
Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...