Как получить все ip адреса в локальной сети (особенно принтеров) - C#

Узнай цену своей работы

Формулировка задачи:

Допустим, есть локальная сеть в ней несколько компьютеров и сетевых принтеров, пробовал сначала получить имена всех членов сети, а по ним уже вычислить, ip однако, получается, вывести только список компьютеров, но принтеры за редким исключением не определяются, а мне надо получить все. Может, кто знает, как сделать? Код программы:
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.Collections;
  7. using System.Runtime.InteropServices;
  8. using System.Net;
  9. namespace ServerEnum
  10. {
  11. internal class Class1
  12. {
  13. [DllImport("netapi32.dll", EntryPoint="NetServerEnum")]
  14. public static extern NERR NetServerEnum([MarshalAs(UnmanagedType.LPWStr)] string ServerName, int Level, out IntPtr BufPtr, int PrefMaxLen, ref int EntriesRead, ref int TotalEntries, SV_101_TYPES ServerType, [MarshalAs(UnmanagedType.LPWStr)] string Domain, int ResumeHandle);
  15. [DllImport("netapi32.dll", EntryPoint="NetApiBufferFree")]
  16. public static extern NERR NetApiBufferFree(IntPtr Buffer);
  17.  
  18. [Flags]
  19. public enum SV_101_TYPES : uint
  20. {
  21. SV_TYPE_WORKSTATION = 0x00000001,
  22. SV_TYPE_SERVER = 0x00000002,
  23. SV_TYPE_SQLSERVER = 0x00000004,
  24. SV_TYPE_DOMAIN_CTRL = 0x00000008,
  25. SV_TYPE_DOMAIN_BAKCTRL = 0x00000010,
  26. SV_TYPE_TIME_SOURCE = 0x00000020,
  27. SV_TYPE_AFP = 0x00000040,
  28. SV_TYPE_NOVELL = 0x00000080,
  29. SV_TYPE_DOMAIN_MEMBER = 0x00000100,
  30. SV_TYPE_PRINTQ_SERVER = 0x00000200,
  31. SV_TYPE_DIALIN_SERVER = 0x00000400,
  32. SV_TYPE_XENIX_SERVER = 0x00000800,
  33. SV_TYPE_SERVER_UNIX = SV_TYPE_XENIX_SERVER,
  34. SV_TYPE_NT = 0x00001000,
  35. SV_TYPE_WFW = 0x00002000,
  36. SV_TYPE_SERVER_MFPN = 0x00004000,
  37. SV_TYPE_SERVER_NT = 0x00008000,
  38. SV_TYPE_POTENTIAL_BROWSER = 0x00010000,
  39. SV_TYPE_BACKUP_BROWSER = 0x00020000,
  40. SV_TYPE_MASTER_BROWSER = 0x00040000,
  41. SV_TYPE_DOMAIN_MASTER = 0x00080000,
  42. SV_TYPE_SERVER_OSF = 0x00100000,
  43. SV_TYPE_SERVER_VMS = 0x00200000,
  44. SV_TYPE_WINDOWS = 0x00400000,
  45. SV_TYPE_DFS = 0x00800000,
  46. SV_TYPE_CLUSTER_NT = 0x01000000,
  47. SV_TYPE_TERMINALSERVER = 0x02000000,
  48. SV_TYPE_CLUSTER_VS_NT = 0x04000000,
  49. SV_TYPE_DCE = 0x10000000,
  50. SV_TYPE_ALTERNATE_XPORT = 0x20000000,
  51. SV_TYPE_LOCAL_LIST_ONLY = 0x40000000,
  52. SV_TYPE_DOMAIN_ENUM = 0x80000000,
  53. SV_TYPE_ALL = 0xFFFFFFFF,
  54. }
  55. [StructLayout(LayoutKind.Sequential)]
  56. public struct SERVER_INFO_101
  57. {
  58. [MarshalAs(UnmanagedType.U4)] public uint sv101_platform_id;
  59. [MarshalAs(UnmanagedType.LPWStr)] public string sv101_name;
  60. [MarshalAs(UnmanagedType.U4)] public uint sv101_version_major;
  61. [MarshalAs(UnmanagedType.U4)] public uint sv101_version_minor;
  62. [MarshalAs(UnmanagedType.U4)] public uint sv101_type;
  63. [MarshalAs(UnmanagedType.LPWStr)] public string sv101_comment;
  64. }
  65.  
  66. public enum PLATFORM_ID : uint
  67. {
  68. PLATFORM_ID_DOS = 300,
  69. PLATFORM_ID_OS2 = 400,
  70. PLATFORM_ID_NT = 500,
  71. PLATFORM_ID_OSF = 600,
  72. PLATFORM_ID_VMS = 700,
  73. }
  74.  
  75. public enum NERR
  76. {
  77. NERR_Success = 0,
  78. ERROR_ACCESS_DENIED = 5,
  79. ERROR_NOT_ENOUGH_MEMORY = 8,
  80. ERROR_BAD_NETPATH = 53,
  81. ERROR_NETWORK_BUSY = 54,
  82. ERROR_INVALID_PARAMETER = 87,
  83. ERROR_INVALID_LEVEL = 124,
  84. ERROR_MORE_DATA = 234,
  85. ERROR_EXTENDED_ERROR = 1208,
  86. ERROR_NO_NETWORK = 1222,
  87. ERROR_INVALID_HANDLE_STATE = 1609,
  88. ERROR_NO_BROWSER_SERVERS_FOUND = 6118,
  89. }
  90. public static ArrayList GetServerList(SV_101_TYPES type)
  91. {
  92. SERVER_INFO_101 si;
  93. IntPtr pInfo = IntPtr.Zero;
  94. int etriesread = 0;
  95. int totalentries = 0;
  96. ArrayList srvs = new ArrayList();
  97. srvs.Clear();
  98. try
  99. {
  100. NERR err = NetServerEnum(null, 101, out pInfo, -1, ref etriesread, ref totalentries, type, null, 0);
  101. if ((err == NERR.NERR_Success || err == NERR.ERROR_MORE_DATA) && pInfo != IntPtr.Zero)
  102. {
  103. int ptr = pInfo.ToInt32();
  104. for (int i = 0; i < etriesread; i++)
  105. {
  106. si = (SERVER_INFO_101) Marshal.PtrToStructure(new IntPtr(ptr), typeof (SERVER_INFO_101));
  107. srvs.Add(si.sv101_name);
  108. ptr += Marshal.SizeOf(si);
  109. }
  110. }
  111. }
  112. catch (Exception)
  113. {
  114. }
  115. finally
  116. {
  117. if (pInfo != IntPtr.Zero)
  118. {
  119. NetApiBufferFree(pInfo);
  120. }
  121. }
  122. return (srvs);
  123. }
  124. [STAThread]
  125. static void Main()
  126. {
  127. Console.WriteLine("{0} WORKSTATION", new string('=', 10));
  128.  
  129. ArrayList list = GetServerList(SV_101_TYPES.SV_TYPE_ALL);
  130. foreach (string name in list)
  131. {
  132. Console.WriteLine(name);
  133. try
  134. {
  135. IPHostEntry iphostentry = Dns.GetHostByName(name);
  136. foreach (IPAddress ipaddress in iphostentry.AddressList)
  137. {
  138. Console.WriteLine("IP #" + ipaddress.ToString());
  139. }
  140.  
  141. }
  142. catch (Exception ex)
  143. {
  144. Console.WriteLine(ex.Message);
  145. }
  146. }
  147. list.Clear();
  148. Console.ReadLine();
  149. }
  150. }
  151. }

Решение задачи: «Как получить все ip адреса в локальной сети (особенно принтеров)»

textual
Листинг программы
  1. where Name LIKE '" + portName + "'"

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 3.8 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы