نمایش نتایج 1 تا 35 از 35

نام تاپیک: بدست آوردن لیست کامپیوترهای متصل به شبکه محلی

  1. #1
    کاربر دائمی آواتار پرستو پارسایی
    تاریخ عضویت
    آبان 1392
    محل زندگی
    تهران
    پست
    458

    بدست آوردن لیست کامپیوترهای متصل به شبکه محلی

    Imports System.Net.NetworkInformation

    Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    ' بدست آوردن لیست رابط‌ های شبکه
    Dim interfaces As NetworkInterface() = NetworkInterface.GetAllNetworkInterfaces()


    ' پیمایش رابط‌ های شبکه
    For Each networkInterface As NetworkInterface In interfaces
    ' فیلتر کردن رابط‌ هایی که به اینترنت متصل نیستند
    If networkInterface.NetworkInterfaceType = NetworkInterfaceType.Ethernet AndAlso networkInterface.OperationalStatus = OperationalStatus.Up Then
    ' بدست آوردن آدرس IP رابط شبکه
    Dim ipProperties As IPInterfaceProperties = networkInterface.GetIPProperties()
    Dim ipAddress As IPAddress = Nothing
    For Each ip As IPAddress In ipProperties.UnicastAddresses
    If ip.AddressFamily = Net.Sockets.AddressFamily.InterNetwork Then
    ipAddress = ip
    Exit For
    End If
    Next


    ' بدست آوردن لیست کامپیوترهای متصل به رابط شبکه
    Dim pingSender As New Ping()
    Dim options As New PingOptions()
    options.DontFragment = True
    Dim buffer As String = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
    Dim timeout As Integer = 120
    Dim reply As PingReply = pingSender.Send(ipAddress, timeout, buffer, options)
    If reply.Status = IPStatus.Success Then
    Dim connectedComputers As New List(Of String)()
    Dim arpTable As String = GetArpTable()
    Dim lines As String() = arpTable.Split(New String() {Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries)
    For Each line As String In lines
    If line.Contains(reply.Address.ToString()) Then
    Dim parts As String() = line.Split(New Char() {" "c}, StringSplitOptions.RemoveEmptyEntries)
    connectedComputers.Add(parts(0))
    End If
    Next
    ListBox1.Items.Add("Connected Computers on " & networkInterface.Name & " (" & ipAddress.ToString() & "):")
    For Each connectedComputer As String In connectedComputers
    ListBox1.Items.Add(connectedComputer)
    Next
    ListBox1.Items.Add("")
    End If
    End If
    Next
    End Sub


    Private Function GetArpTable() As String
    Dim arpTable As String = ""
    Dim process As New Process()
    process.StartInfo.FileName = "arp"
    process.StartInfo.Arguments = "-a"
    process.StartInfo.CreateNoWindow = True
    process.StartInfo.RedirectStandardOutput = True
    process.StartInfo.UseShellExecute = False
    process.Start()
    arpTable = process.StandardOutput.ReadToEnd()
    process.WaitForExit()
    Return arpTable
    End Function
    End Class

  2. #2
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

    نقل قول: بدست آوردن لیست کامپیوترهای متصل به شبکه محلی

    این که دانسته های خودتون رو با دیگران در میان میگذارین بسیار کار نیک و پسندیده ای هست،
    برای همین بهتره که نوع تاپیک رو "آموزش" بگذارین،
    و امیدوارم همین رویه رو مثل آقای ROSTAM2 ادامه بدین.

    -------

    در مورد این کد من چند پرسش دارم:

    1- بعید میدونم این کد کار کنه (هرچند که گویا خودتون تست کردین)
    چون مبتنی بر جدول arp هست که با دستور "arp -a" میخونین.

    این جدول اطلاعاتش برای این کار مناسب نیست و همه دستگاه ها رو نمیتونه نشون بده،
    مثلا دستگاه های موبایل.
    همچنین اطلاعاتش هم به سرعت آپدیت نمیشه (مثلا بعد از خاموش شدن دستگاه تا مدتها تو جدول رکوردش هست)
    از طرفی فقط ip و mac address رو به هم ارتباط میده و اسم کامپیوتر رو باید از راه دیگه ای پیدا کنین.

    الان شما بعد از پیدا کردن ip دستگاهی که این کد رو اجرا میکنه جدول arp رو میخونین.
    خب این باعث نمیشه رکوردهای بقیه دستگاه ها آپدیت بشه.
    فکر کنم راه مطمئن(تر) اینه که به تک تک آدرس های subnetی که دستگاه شما قرار داره پینگ کنین و ببینین جواب میده یا نه.
    و این هم زمانبره.

    2- موارد دیگه هم هست در کد:
    مثلا شما buffer رو از نوع string تعریف کردین،
    تا جایی که یادمه باید از نوع ()byte باشه - حالا شاید فریمورک قدیمی استفاده کردین یا option strict رو در کامپایلر خاموش کردین.

    حالا سر فرصت کد شما رو اجرا میکنم شاید اشتباه کرده باشم.

  3. #3
    کاربر دائمی آواتار پرستو پارسایی
    تاریخ عضویت
    آبان 1392
    محل زندگی
    تهران
    پست
    458

    نقل قول: بدست آوردن لیست کامپیوترهای متصل به شبکه محلی

    با سلام ممنونم از توجه شما ، اطلاعات من آنقدر بالا نیست که نام تاپیک را آموزش بگذارم فقط مواردی را که تجربه کردم ، به اشتراک گذاشتم در مورد مشکلات کد بالا کاملا درست فرمودید ارتباط یا موبایل در نظر گرفته نشده و مشکلاتی هم دارد و کامل نیست . در این کد موارد اشاره شده شما بیشتر رعایت شده ولی کامل نیست . ممنون میشم مشکلات احتمالی را بفرمائید . سپاس
    Imports System.Net.NetworkInformation
    Imports System.Net.Sockets
    Imports System.Text
    Imports System.Threading
    Imports ManagedUPnP
    Imports Mono.Zeroconf


    Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    ' Initialize DataGridView columns
    DataGridView1.Columns.Add("HostName", "Host Name")
    DataGridView1.Columns.Add("IPAddress", "IP Address")
    DataGridView1.Columns.Add("MACAddress", "MAC Address")
    DataGridView1.Columns.Add("DeviceType", "Device Type")


    ' Set DataGridView column widths
    DataGridView1.Columns(0).Width = 150
    DataGridView1.Columns(1).Width = 150
    DataGridView1.Columns(2).Width = 150
    DataGridView1.Columns(3).Width = 150
    End Sub


    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    ' Clear DataGridView rows
    DataGridView1.Rows.Clear()


    ' Get local IP address
    Dim localIP As IPAddress = GetLocalIPAddress()


    ' Scan network for devices
    ScanNetwork(localIP)


    ' Display message box indicating scan is complete
    MsgBox("Scan complete!")
    End Sub


    Private Sub ScanNetwork(localIP As IPAddress)
    ' Initialize UPnP device list
    Dim devices As UPnPDeviceCollection = Nothing


    ' Initialize Bonjour service browser
    Dim serviceBrowser As New ServiceBrowser()
    AddHandler serviceBrowser.ServiceAdded, AddressOf BonjourServiceAdded


    ' Initialize Ping sender
    Dim pingSender As New Ping()


    ' Enumerate IP addresses in local subnet
    For i As Integer = 1 To 254
    Dim ip As String = localIP.ToString()
    ip = ip.Substring(0, ip.LastIndexOf(".") + 1) + i.ToString()


    ' Ping IP address to see if it is online
    Dim pingReply As PingReply = pingSender.Send(ip, 100)
    If pingReply.Status = IPStatus.Success Then
    ' Add row to DataGridView for online device
    Dim row As New DataGridViewRow()
    row.CreateCells(DataGridView1)
    row.Cells(1).Value = ip
    row.Cells(2).Value = GetMACAddress(ip)
    row.Cells(3).Value = "Unknown"


    ' Add row to DataGridView
    DataGridView1.Rows.Add(row)


    ' Get device type using UPnP
    If devices Is Nothing Then
    devices = UPnPDeviceFinder.FindByType("upnp:rootdevice", 0)
    End If
    For Each device As UPnPDevice In devices
    Dim deviceIP As String = device.PresentationURL.Host
    If deviceIP = ip Then
    row.Cells(0).Value = device.FriendlyName
    row.Cells(3).Value = "UPnP"
    Exit For
    End If
    Next


    ' Get device type using Bonjour
    serviceBrowser.Browse("_http._tcp", "local")
    End If
    Next
    End Sub


    Private Sub BonjourServiceAdded(sender As Object, e As ServiceBrowseEventArgs)
    ' Check if Bonjour service is for an online device
    Dim isOnline As Boolean = False
    For Each row As DataGridViewRow In DataGridView1.Rows
    If row.Cells(1).Value = e.Service.HostEntry.AddressList(0).ToString() Then
    isOnline = True
    Exit For
    End If
    Next


    ' If Bonjour service is for an online device, update device type
    If isOnline Then
    For Each row As DataGridViewRow In DataGridView1.Rows
    If row.Cells(1).Value = e.Service.HostEntry.AddressList(0).ToString() And row.Cells(3).Value = "Unknown" Then
    row.Cells(0).Value = e.Service.HostEntry.HostName
    row.Cells(3).Value = "Bonjour"
    Exit For
    End If
    Next
    End If
    End Sub


    Private Function GetLocalIPAddress() As IPAddress
    ' Get local IP address
    Dim hostName As String = Dns.GetHostName()
    Dim addresses As IPAddress() = Dns.GetHostAddresses(hostName)
    For Each address As IPAddress In addresses
    If address.AddressFamily = AddressFamily.InterNetwork Then
    Return address
    End If
    Next
    Return Nothing
    End Function


    Private Function GetMACAddress(ip As String) As String
    ' Get MAC address for IP address
    Dim macAddress As String = ""
    Dim pProcess As New Process()
    pProcess.StartInfo.FileName = "arp"
    pProcess.StartInfo.Arguments = "-a " & ip
    pProcess.StartInfo.UseShellExecute = False
    pProcess.StartInfo.RedirectStandardOutput = True
    pProcess.StartInfo.CreateNoWindow = True
    pProcess.Start()
    Dim strOutput As String = pProcess.StandardOutput.ReadToEnd()
    Dim substrings As String() = strOutput.Split("-"c)
    If substrings.Length > 2 Then
    macAddress = substrings(3).Substring(0, 8)
    If macAddress.Contains("00") Then
    macAddress = macAddress.Replace("00", "0")
    End If
    End If
    Return macAddress
    End Function
    End Class


    برای استفاده از این پروتکل‌ها، باید کتابخانه‌های مربوطه را در پروژه خود اضافه کنید
    آخرین ویرایش به وسیله پرستو پارسایی : شنبه 23 اردیبهشت 1402 در 10:29 صبح

  4. #4
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

    نقل قول: بدست آوردن لیست کامپیوترهای متصل به شبکه محلی

    سلام دوباره
    طلاعات من آنقدر بالا نیست که نام تاپیک را آموزش بگذارم
    خب این رو باید بحساب شکسته نفسی شما گذاشت.

    اگر حمل بر خرده گیری نیست، بعنوان شرکت در بحث و رسیدن به خواسته، چند نکته رو مطرح میکنم
    و امیدوارم که دیگران هم وارد بحث بشن چون همونجور که خواهیم دید این مطلب بار آموزشی زیادی داره.

  5. #5
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

    نقل قول: بدست آوردن لیست کامپیوترهای متصل به شبکه محلی

    در مورد برنامه اول (پست شماره 1):
    من برای اطمینان سعی کردم کد رو اجرا کنم ولی 2 خطا داشت که پیوست میکنم.
    که با خاموش کردن options strict یا عوض کردن فریمورک (از 4.8 به 2) هم برطرف نشد.

    البته هر دو با تغییر کوچک در کد قابل رفع هست ولی ادامه ندادم چون روش کار هم درست نیست (بنظر من البته.)

    error1.png

    error2.png

  6. #6
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

    نقل قول: بدست آوردن لیست کامپیوترهای متصل به شبکه محلی

    در مورد برنامه دوم (پست شماره 3):

    این رو تست نکردم به دلیل این که دو رفرنس نیاز هست،
    که البته Mono.Zeroconf از اسمش مشخص هست که از طریق nuget راحت نصب میشه.

    ولی ManagedUPnP رو مشخص نیست که دقیقا کدوم کتابخانه مد نظر بوده چون کتابخانه های زیادی به این اسم هست.
    به هر حال این یکی رو فقط به مرور کد بسنده کردم.
    البته فکر کنم که با کتابخانه استاندارد خود ویندوز هم بشه کد شما رو اجرا کرد (احتمالا با یک سری تغییرات)، ولی این رو هم تست نکردم.

    چند نکته به چشمم خورد که با اجازتون مطرح میکنم:
    1- در بخشی از کد چیزی به اسم Bonjour service دیده میشه،
    یعنی نیاز سرویسی هست که از قبل باید روی دستگاه اجرا شده باشه و من روی چند دستگاه مختلف چک کردم این سرویس نبود.

    2- در کد یک تابع GetLocalIPAddress هست که مشخصه قراره ip اینترفیس شبکه رو برگردونه.
    یعنی فرض بر این هست که فقط یک اینترفیس داریم و اون هم فقط یک ip داره که خب البته شاید در خیلی از موارد درست باشه ولی در همه موارد درست نیست.
    خیلی از لپتاپ ها هم اینترفیس اترنت دارن و هم وایرلس و هر دو هم ممکنه up باشه.
    همچنین یک اینترفیس ممکنه بیشتر از یک ip داشته باشه.

    3- در روتین ScanNetwork فرض بر این گذاشته شده که ip دستگاه class C هست که این هم در همه موارد درست نیست.
    باید خودمون از روی subnet mask و ip محدوه آدرس ها رو پیدا کنیم.

    4- در تابع GetMACAddress ،که برای پیدا کردن MAC Address از روی ip address هست،
    از جدول arp استفاده شده.
    البته وقتی پینگ میکنیم قطعا اطلاعات جدول آپدیت شده و درست هست و این کد هم درست و کار میکنه.
    ولی میتونیم بجای این که در یک پروسس مخفی دستور arp -a رو اجرا کنیم و خروجی اون رو بعنوان text بخونیم و تفسیر کنیم،
    مستقیما اون رو بگیریم (بعدا توضیح میدم چجوری).

    5- با کتابخانه استاندارد upnp خود ویندوز دستور زیر 7-8 ثانیه اجراش زمان میبره (تست کردم):
    devices = UPnPDeviceFinder.FindByType("upnp:rootdevice", 0)


    حالا این در یک حلقه هست که قراره 253 بار اجرا بشه!
    اول از همه این که لازم نیست درون حلقه باشه و کافی هست یک بار قبل اسکن اجرا بشه و نتایجش رو نگه دارین.
    ولی در این کد حتی با فرض این که کتابخانه ای که شما استفاده کردین خیلی بهینه و سریع باشه و نتایج رو فقط در 1 ثانیه برگردونه،
    دست کم 4 دقیقه به زمان اسکن اضافه میکنه.
    خود اسکن هم بتنهایی با این روش (یکی یکی پشت سر هم) با فرض نیم ثانیه برای هر پینگ 2 دقیقه زمان میبره.

    من حدس میزنم که اینجا هیچکس این کد رو تست نکرده وگرنه یک پست در این مورد باید اینجا میبود.

  7. #7
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

    نقل قول: بدست آوردن لیست کامپیوترهای متصل به شبکه محلی

    خب حالا لازم هست بعد از گفتن همه این موارد، راه حل هم ارائه بشه وگرنه صرف شمردن اشکالات سودی نداره.
    من یک برنامه آماده کردم که اینها رو در اون در نظر گرفتم و تست هم کردم (در حد ابتدایی).
    اون رو کامل اینجا پیوست میکنم تا دیگران هم روی سیتم هاشون تست و ایرادهاش رو گوشزد کنن.

    آماده سازی توضیحات اون کمی زمان میبره.
    فعلا یک اسکرین شات از شناسایی اینترفیس های یک سیستم تست با دو اینترفیس اترنت و دو اینترفیس وایرلس که یکی از اونها 2 ip address داره میگذارم:
    ضمیمه 154642
    ضمیمه 154643

  8. #8
    کاربر دائمی آواتار پرستو پارسایی
    تاریخ عضویت
    آبان 1392
    محل زندگی
    تهران
    پست
    458

    نقل قول: بدست آوردن لیست کامپیوترهای متصل به شبکه محلی

    ممنونم از تحلیلی که در مورد کدی که ارائه کردم فرمودید .
    ManagedUPnP برای پیاده‌سازی پروتکل UPnP (یا Universal Plug and Play) در برنامه‌های .NET استفاده می‌شود. UPnP یک پروتکل شبکه است که برای ارتباط بین دستگاه‌های شبکه و تبادل اطلاعات دربارهٔ خدمات و قابلیت‌های آن‌ها استفاده می‌شود (جهت اطلاع بازدید کنندگان که کمتر با این کتابخانه کار کردند)
    مورد دوم . بله درست فرمودید برای پیدا کردن تمامی آدرس‌های IP دستگاه و چندین رابط شبکه، می‌توان از توابع دیگری مانند Dns.GetHostEntry یا NetworkInterface.GetAllNetworkInterfaces استفاده کرد. به عنوان مثال، تابع GetLocalIPAddress را می‌توان به صورت زیر به‌روزرسانی کرد تا تمامی آدرس‌های IP را بازگرداند
    Private Function GetLocalIPAddresses() As List(Of IPAddress)
    Dim localIPs As New List(Of IPAddress)()
    Dim hostName As String = Dns.GetHostName()
    Dim addresses As IPAddress() = Dns.GetHostAddresses(hostName)
    For Each address As IPAddress In addresses
    If address.AddressFamily = AddressFamily.InterNetwork Then
    localIPs.Add(address)
    End If
    Next
    For Each networkInterface As NetworkInterface In NetworkInterface.GetAllNetworkInterfaces()
    If networkInterface.NetworkInterfaceType = NetworkInterfaceType.Wireless80211 OrElse
    networkInterface.NetworkInterfaceType = NetworkInterfaceType.Ethernet Then
    Dim properties As IPInterfaceProperties = networkInterface.GetIPProperties()
    For Each address As IPAddress In properties.UnicastAddresses
    If address.AddressFamily = AddressFamily.InterNetwork Then
    localIPs.Add(address)
    End If
    Next
    End If
    Next
    Return localIPs

    End Function


    در مورد سوم هم صحیح فرمودید برای رفع این مشکل ، به نظرم میتوان کد را اینگونه تعریف کرد.
    Private Sub ScanNetwork(localIP As IPAddress)
    ' گرفتن subnet mask
    Dim subnetMask As IPAddress = Nothing
    For Each networkInterface As NetworkInterface In NetworkInterface.GetAllNetworkInterfaces()
    Dim properties As IPInterfaceProperties = networkInterface.GetIPProperties()
    For Each address As UnicastIPAddressInformation In properties.UnicastAddresses
    If address.Address.AddressFamily = AddressFamily.InterNetwork AndAlso address.Address.Equals(localIP) Then
    subnetMask = address.IPv4Mask
    Exit For
    End If
    Next
    If subnetMask IsNot Nothing Then
    Exit For
    End If
    Next


    ' محاسبهٔ آدرس شبکه و آدرس پخش
    Dim ipBytes As Byte() = localIP.GetAddressBytes()
    Dim maskBytes As Byte() = subnetMask.GetAddressBytes()
    Dim networkBytes As Byte() = New Byte(3) {}
    Dim broadcastBytes As Byte() = New Byte(3) {}
    For i As Integer = 0 To 3
    networkBytes(i) = CByte(ipBytes(i) And maskBytes(i))
    broadcastBytes(i) = CByte(ipBytes(i) Or (Not maskBytes(i)))
    Next
    Dim networkAddress As New IPAddress(networkBytes)
    Dim broadcastAddress As New IPAddress(broadcastBytes)


    ' پیمایش آدرس‌های شبکه
    For i As Integer = BitConverter.ToInt32(networkBytes, 0) + 1 To BitConverter.ToInt32(broadcastBytes, 0) - 1
    Dim ip As New IPAddress(BitConverter.GetBytes(i))
    ' اجرای عملیات در آدرس IP
    Next

    End Sub


    آخرین ویرایش به وسیله پرستو پارسایی : پنج شنبه 28 اردیبهشت 1402 در 21:57 عصر

  9. #9
    کاربر دائمی آواتار پرستو پارسایی
    تاریخ عضویت
    آبان 1392
    محل زندگی
    تهران
    پست
    458

    نقل قول: بدست آوردن لیست کامپیوترهای متصل به شبکه محلی

    در مورد گزینه 4 : بله، درست می‌فرمایید که در کد فوق به دلیل استفاده از حلقه، زمان اجرای برنامه افزایش می‌یابد. در صورت استفاده از یک کتابخانه مناسب برای پینگ، می‌توان زمان اجرای برنامه را بهبود داد ولی به هرحال، استفاده از حلقه و پینگ تک تک آدرس‌ها از لحاظ کارایی بهینه نیست و می‌تواند در صورت وجود تعداد زیادی آدرس، زمان اجرای برنامه را به شدت افزایش دهد.
    بنظرم برای بهبود کارایی و زمان اجرای برنامه، می‌توان از روش‌های بهتری برای پینگ استفاده کرد و همچنین میتوان از روش‌های جمع‌آوری آدرس‌های IP و اجرای پینگ به صورت همزمان و با استفاده از تعدادی نخ (Thread) استفاده کرد
    آخرین ویرایش به وسیله پرستو پارسایی : شنبه 30 اردیبهشت 1402 در 09:50 صبح

  10. #10
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

    نقل قول: بدست آوردن لیست کامپیوترهای متصل به شبکه محلی

    بنظرم برای بهبود کارایی و زمان اجرای برنامه، می‌توان از روش‌های بهتری برای پینگ استفاده کرد و همچنین میتوان از روش‌های جمع‌آوری آدرس‌های IP و اجرای پینگ به صورت همزمان و با استفاده از تعدادی نخ (Thread) استفاده کرد
    بله، راه درست همین هست.
    1- هم کل پروسه پینگ باید همزمان انجام بشه -حالا یا با task یا parallel.for یا backgroundworker یا مستقیما خود thread ؛
    واقعا شاید بشه به بیشتر 10 روش این رو پیاده کرد.
    من خودم parallel.for یا task رو ترجیح میدم چون کار با اونها خیلی راحت هست و در اصل اینها هم روی threading پیاده شدن ولی دردسر پیاده سازی کمتری دارن.
    از طرفی فکر کنم مثلا تعریف یک thread برای هر پینگ ساده به نوعی overkill هست.

    2- هم این که پروسه گرفتن اطلاعات دستگاه ها با upnp باید همزمان با پروسه پینگ باشه،
    و پر کردن جدول نهایی و نمابش نتیجه هم باید پس از پایان هر دو پروسه انجام بشه.

    امیدوارم فردا بتونم توضیحات برنامه رو آماده و اون رو پیوست کنم.


    و هم این که

  11. #11
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

    نقل قول: بدست آوردن لیست کامپیوترهای متصل به شبکه محلی

    با اجازه شما کدهای پست 8 رو یک نگاه انداختم و تابع GetLocalIPAddresses بنظر درست هست،
    البته هم اترنت و هم وایرلس بیشتر از یک نوع داریم و من اینجوری نوشتم:

            For Each nwkint As NetworkInterface In NetworkInterface.GetAllNetworkInterfaces()
    If nwkint.OperationalStatus <> OperationalStatus.Up Then Continue For
    If (nwkint.NetworkInterfaceType.ToString.ToLower.Cont ains("ethernet") OrElse
    nwkint.NetworkInterfaceType.ToString.ToLower.Conta ins("wireless")) Then
    For Each ipinfo As UnicastIPAddressInformation In nwkint.GetIPProperties.UnicastAddresses
    If ipinfo.Address.AddressFamily = Net.Sockets.AddressFamily.InterNetwork Then


    در ضمن برای راحتی یک structure تعریف کردم که مشخصات هر اینترفیس رو نگه میداره:
        Structure NIC   ' Network Interface
    Dim Adapter_Name As String
    Dim Connection_ID As String
    Dim Inteface_Type As NetworkInterfaceType
    Dim IP_Address As IPAddress
    Dim Subnet_Mask As IPAddress
    Dim MAC_Address As PhysicalAddress
    Dim Gateways As IPAddress()
    Dim DNSs As IPAddress()
    End Structure


    و لیست رو از نوع همین تایپ تعریف کردم:
    Private NICs_list As New List(Of NIC)

    بنابراین دیگه نیازی به حلقه (گرفتن subnet mask) نیست.

  12. #12
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

    نقل قول: بدست آوردن لیست کامپیوترهای متصل به شبکه محلی

    این رو هم لطفا چک کنین:
    broadcastBytes(i) = CByte(ipBytes(i) Or(NotmaskBytes(i)))


    اون OR باید XOR باشه.

  13. #13
    کاربر دائمی آواتار پرستو پارسایی
    تاریخ عضویت
    آبان 1392
    محل زندگی
    تهران
    پست
    458

    نقل قول: بدست آوردن لیست کامپیوترهای متصل به شبکه محلی

    با سلام عملگر OR در اینجا به درستی استفاده شده . این عملگر به این شکل عمل می‌کند که در صورتی که بیت‌های هر دو عدد در جایگاه مشابه برابر باشند، بیت متناظر با آن دو در عدد خروجی برابر با آن خواهد بود. در غیر این صورت، بیت متناظر با آن دو در عدد خروجی برابر با 1 خواهد بود. در عمل، اگر عملگر XOR با OR جایگزین شود، محاسبات برای آدرس پخش صحیح انجام نخواهد شد و نتیجه درستی به دست نخواهد آمد. زیرا عملگر XOR در برخی جایگاه‌ها، به جای تغییر بیت به جای دیگری، بیت متناظر با آن جایگاه را تغییر خواهد داد که باعث تولید آدرس پخش نامعتبر می شود
    ( این توضیحات مرور افکارم هست و نوعی درس پس دادن . لطفا سوء تفاهم نشود)
    آخرین ویرایش به وسیله پرستو پارسایی : شنبه 30 اردیبهشت 1402 در 23:01 عصر

  14. #14
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

    نقل قول: بدست آوردن لیست کامپیوترهای متصل به شبکه محلی

    روشی که من استفاده کردم به این صورت هست:
    1- تعریف استراکچر (NIC) برای اینترفیس شبکه
    2- تعریف دیتاتیبل (NICs_dt) برای نمایش اینترفیس های شبکه در دیتاگریدویو (DGV_NICs)
    3- تعریف یک لیست ار نوع NIC به نام (NICs_list) برای مشخصات اینترفیس های شبکه
    4- تعریف یک استراکچر (Device) برای دستگاه روی شبکه
    5- تعریف دیتاتیبل (Devices_dt) برای نمایش دستگاه ها در دیتاگریدویو (DGV_Devices)
    6- تعریف یک لیست از نوع Device به نام (Devices_list) برای مشخصات دستگاه ها
    7- تعریف یک لیست از نوع Device به نام (DevicesUPNP_list) برای تکمیل مشخصات دستگاه ها از روی upnp
    8- تعریف یک background worker به نام BgWorker_Scan برای عملیات پینگ تمام subnet اینترفیس انتخاب شده
    9 -تعریف یک background worker به نام BgWorker_UPNP_Info برای کوئری گرفتن مشخصات دستگاه ها از سرویس upnp
    10- تعریف یک چک باکس (CHK_Use_UPNP) برای تعیین این که آیا upnp هم استفاده شود یا نه.
    11 - با شروع اسکن، هر دو backgound worker همزمان شروع به کار میکنند (یا فقط پروسه scan با توجه وضعیت CHK_Use_UPNP).
    هر کدام در پایان عملیات وضعیت دیگری را چک کرده و در صورتی که هر دو تمام شده باشند از روی لیست deviceها،دیتاتیبل Devices_dt پر میشود.
    12- در BgWorker_Scan با استفاده از Parallel.For عملیات پینگ بصورت همزمان انجام و در صورتی که پاسخی از هر ip دریافت شود مشخصات به Devices_list اضافه میشود.
    13- پس از پر کردن Devices_dt از روی Devices_list ، اگر DevicesUPNP_list هم دستگاهی داشته باشد از روی ip (و اگر نداشته باشد نام دستگاه)،
    مشخصاتی نظیر FriendlyName , ManufacturerName , ModelName , SerialNumber آپدیت میشود.

  15. #15
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

    نقل قول: بدست آوردن لیست کامپیوترهای متصل به شبکه محلی

    Imports System.Net
    Imports System.Net.NetworkInformation


    Public Class LAN_Devices
    #Region "Declarations"
    Private NICs_dt As New DataTable
    Private NICs_list As New List(Of NIC)

    Private Devices_dt As New DataTable
    Private Devices_list As New List(Of Device)
    Private DevicesUPNP_list As New List(Of Device)

    Private IP_Address As IPAddress
    Private Subnet_Mask As IPAddress
    Private Network_Address As IPAddress
    Private Broadcast_Address As IPAddress
    Private First_Usable_IP_Address As IPAddress
    Private Last_Usable_IP_Address As IPAddress
    Private Usable_Hosts_Count As Integer
    Private MacVendors As New DataSet

    Private Scan_Done As Boolean
    Private UPNP_Done As Boolean

    Structure NIC ' Network Interface
    Dim Adapter_Name As String ' from WMI
    Dim Connection_ID As String
    Dim Inteface_Type As NetworkInterfaceType
    Dim IP_Address As IPAddress
    Dim Subnet_Mask As IPAddress
    Dim MAC_Address As PhysicalAddress
    Dim Gateways As IPAddress()
    Dim DNSs As IPAddress()
    End Structure

    Structure Device
    Dim HostName As String ' from host-entry or upnp
    Dim IP_Address As IPAddress ' from ping reply
    Dim MAC_Address As PhysicalAddress ' from ARP table
    Dim MAC_Vendor As String ' from vendors data
    Dim MAC_String As String
    Dim Manufacturer As String ' from upnp
    Dim Model As String ' from upnp
    Dim ModelNumber As String ' from upnp
    Dim SerialNumber As String ' from upnp
    End Structure
    #End Region ' Declarations

  16. #16
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

    نقل قول: بدست آوردن لیست کامپیوترهای متصل به شبکه محلی

    روتین پیدا کردن تمام اینترفیس های شبکه (فقط اترنت و وایرلس) که up هستند:
        Sub Get_LanInterfaces() 
    BTN_Scan.Enabled = False
    NICs_list.Clear()
    NICs_dt.Clear()
    For Each nwkint As NetworkInterface In NetworkInterface.GetAllNetworkInterfaces()
    If nwkint.OperationalStatus <> OperationalStatus.Up Then Continue For
    If (nwkint.NetworkInterfaceType.ToString.ToLower.Cont ains("ethernet") OrElse
    nwkint.NetworkInterfaceType.ToString.ToLower.Conta ins("wireless")) Then
    For Each ipinfo As UnicastIPAddressInformation In nwkint.GetIPProperties.UnicastAddresses
    If ipinfo.Address.AddressFamily = Net.Sockets.AddressFamily.InterNetwork Then
    Dim nic As New NIC With {
    .Adapter_Name = Get_AdapterName(nwkint.Name),
    .Connection_ID = nwkint.Name,
    .Inteface_Type = nwkint.NetworkInterfaceType,
    .MAC_Address = nwkint.GetPhysicalAddress,
    .IP_Address = ipinfo.Address,
    .Subnet_Mask = ipinfo.IPv4Mask,
    .Gateways = nwkint.GetIPProperties.GatewayAddresses.Select(Fun ction(x) x.Address).ToArray,
    .DNSs = nwkint.GetIPProperties.DnsAddresses.ToArray
    }
    NICs_list.Add(nic)


    Dim dr As DataRow = NICs_dt.NewRow
    dr("Adapter") = nic.Adapter_Name
    dr("Connection ID") = nwkint.Name
    dr("Interface Type") = nwkint.NetworkInterfaceType.ToString
    dr("Mac Address") = String.Join("-", nwkint.GetPhysicalAddress.GetAddressBytes.Select(F unction(x) $"{x:X2}").ToArray)
    dr("IP Address") = String.Join(".", ipinfo.Address.GetAddressBytes.ToArray)
    dr("Subnet Mask") = String.Join(".", ipinfo.IPv4Mask.GetAddressBytes.ToArray)
    dr("Gateway(s)") = String.Join(vbCrLf, nwkint.GetIPProperties.GatewayAddresses.Select(Fun ction(x) x.Address.ToString).ToArray)
    dr("DNS(s)") = String.Join(vbCrLf, nwkint.GetIPProperties.DnsAddresses)
    NICs_dt.Rows.Add(dr)
    End If
    Next
    End If
    Next
    BTN_Scan.Enabled = (NICs_dt.Rows.Count > 0)
    End Sub



  17. #17
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

    نقل قول: بدست آوردن لیست کامپیوترهای متصل به شبکه محلی

    تابع پینگ یک ip و برگرداندن true اگر پاسخ دریافت شود:
        Function IsAlive(address As IPAddress, Optional timeout As Integer = 100) As Boolean 
    Using pingSender As New Ping()
    Return pingSender.Send(
    address:=address,
    timeout:=timeout,
    buffer:=New Byte(31) {},
    options:=New PingOptions(ttl:=128, dontFragment:=True)
    ).Status = IPStatus.Success
    End Using
    End Function



  18. #18
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

    نقل قول: بدست آوردن لیست کامپیوترهای متصل به شبکه محلی

    روتین محاسبه network_address , broadcast_address و ... برای اینترفیس انتخاب شده (interface_index همان row_index اینترفیس انتخاب شده از DGV_NICs است):
        Sub Calc_Addresses(interface_index As Integer) 
    IP_Address = NICs_list(interface_index).IP_Address
    Subnet_Mask = NICs_list(interface_index).Subnet_Mask


    Dim ip_int As UInt32 = BitConverter.ToUInt32(IP_Address.GetAddressBytes, 0)


    Dim mask_bytes As Byte() = Subnet_Mask.GetAddressBytes
    Dim mask_int As UInteger = BitConverter.ToUInt32(mask_bytes, 0)
    Dim not_mask_bytes() As Byte = mask_bytes.Select(Function(r) Not r).ToArray
    Dim not_mask_int As UInteger = BitConverter.ToUInt32(not_mask_bytes, 0)


    Dim network_bytes() As Byte = BitConverter.GetBytes(ip_int And mask_int)
    Dim network_int As UInteger = BitConverter.ToUInt32(network_bytes, 0)
    Network_Address = New IPAddress(network_bytes)


    Dim broadcast_bytes() As Byte = BitConverter.GetBytes(network_int Xor not_mask_int)
    Dim broadcast_int As UInteger = BitConverter.ToUInt32(broadcast_bytes, 0)
    Broadcast_Address = New IPAddress(broadcast_bytes)


    Dim fuip_int As UInteger = BitConverter.ToUInt32(network_bytes.Reverse.ToArra y, 0) + CUInt(1)
    First_Usable_IP_Address = New IPAddress(BitConverter.GetBytes(fuip_int).Reverse. ToArray)


    Dim luip_int As UInteger = BitConverter.ToUInt32(broadcast_bytes.Reverse.ToAr ray, 0) - CUInt(1)
    Last_Usable_IP_Address = New IPAddress(BitConverter.GetBytes(luip_int).Reverse. ToArray)


    Usable_Hosts_Count = CInt(luip_int - fuip_int + 1)
    If Usable_Hosts_Count < 0 Then
    Usable_Hosts_Count = 0
    First_Usable_IP_Address = Nothing
    Last_Usable_IP_Address = Nothing
    End If
    End Sub



  19. #19
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

    نقل قول: بدست آوردن لیست کامپیوترهای متصل به شبکه محلی

    روتین گرفتن اسم اینترفیس با کوئری از WMI :
        Function Get_AdapterName(connection_id As String) As String 
    Using mos As New Management.ManagementObjectSearcher(
    "root\CIMV2",
    "SELECT Name FROM Win32_NetworkAdapter Where NetConnectionID='@cid'".Replace("@cid", connection_id))
    Try
    Dim result As Management.ManagementObject = mos.Get.OfType(Of Management.ManagementObject).FirstOrDefault
    Return result("Name").ToString
    Catch ex As Exception
    Return ""
    End Try
    End Using
    End Function



  20. #20
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

    نقل قول: بدست آوردن لیست کامپیوترهای متصل به شبکه محلی

    تابع پیدا کردن اسم دستگاه ار روی ip address :
        Function Get_HostNameByIP(ip As IPAddress) As String 
    Try
    Return Dns.GetHostEntry(ip).HostName
    Catch ex As Exception
    Return String.Empty
    End Try
    End Function



  21. #21
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

    نقل قول: بدست آوردن لیست کامپیوترهای متصل به شبکه محلی

    تابع پیدا کردن mac address از روی ip address :
        Function Get_MACAddressByIP(ip As IPAddress) As PhysicalAddress 
    Dim mac_address_bytes() As Byte = New Byte(5) {}
    SendARP(
    DestIP:=BitConverter.ToUInt32(ip.GetAddressBytes() , 0),
    SrcIP:=0,
    pMacAddr:=mac_address_bytes,
    PhyAddrLen:=6)
    Return New PhysicalAddress(mac_address_bytes)
    End Function


        <Runtime.InteropServices.DllImport("iphlpapi.dll")  >    Shared Function SendARP(
    DestIP As UInteger,
    SrcIP As UInteger,
    pMacAddr As Byte(),
    ByRef PhyAddrLen As Integer
    ) As Integer
    End Function


    آخرین ویرایش به وسیله mazoolagh : دوشنبه 01 خرداد 1402 در 19:21 عصر

  22. #22
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

    نقل قول: بدست آوردن لیست کامپیوترهای متصل به شبکه محلی

    تابع گرفتن نام سازنده اینترفیس شبکه از روی mac address :
        Function Get_MACVendor(mac As PhysicalAddress) As String 
    Dim prefix As String = String.Join("-", mac.GetAddressBytes.Select(Function(x) $"{x:X2}").ToArray).Substring(0, 8)
    Dim drc As DataRow() = MacVendors.Tables(0).Select($"Prefix='{prefix}'")
    If drc.Length = 0 Then
    Return "--Unknown--"
    Else
    Return drc(0)("Vendor").ToString
    End If
    End Function


    دیتا سازندگان (48837 رکورد) در یک فایل xml همراه با سورس برنامه پیوست خواهد شد.

  23. #23
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

    نقل قول: بدست آوردن لیست کامپیوترهای متصل به شبکه محلی

    آماده سازی دیتاتیبل ها و گریدها ...
        Private Sub lan_computers_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    Status_Label.Text = ""
    Status_Label_Devices.Text = ""


    If NICs_dt.Columns.Count > 0 Then Exit Sub
    MacVendors.ReadXml(Application.StartupPath & "\Mac_Vendors.xml")


    With NICs_dt
    .Columns.Add("Adapter", GetType(String))
    .Columns.Add("MAC Address", GetType(String))
    .Columns.Add("Connection ID", GetType(String))
    .Columns.Add("Interface Type", GetType(String))
    .Columns.Add("IP Address", GetType(String))
    .Columns.Add("Subnet Mask", GetType(String))
    .Columns.Add("Gateway(s)", GetType(String))
    .Columns.Add("DNS(s)", GetType(String))
    End With


    With DGV_NICs
    .DataSource = NICs_dt
    .Columns(0).AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill
    .Columns(6).DefaultCellStyle.WrapMode = DataGridViewTriState.True
    .Columns(7).DefaultCellStyle.WrapMode = DataGridViewTriState.True
    End With




    With Devices_dt
    .Columns.Add("Name", GetType(String))
    .Columns.Add("Manufacturer", GetType(String))
    .Columns.Add("Model", GetType(String))
    .Columns.Add("ModelNumber", GetType(String))
    .Columns.Add("SerialNumber", GetType(String))
    .Columns.Add("IP Address", GetType(String))
    .Columns.Add("MAC Address", GetType(String))
    .Columns.Add("MAC Vendor", GetType(String))
    End With


    With DGV_Devices
    .DataSource = Devices_dt
    .Columns(0).AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill
    .Columns(1).AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill
    .Columns(7).AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill
    End With
    End Sub



  24. #24
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

    نقل قول: بدست آوردن لیست کامپیوترهای متصل به شبکه محلی

    پروسه پینگ بصورت همزمان:
        Private Sub BgWorker_Scan_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BgWorker_Scan.DoWork 
    Scan_Done = False


    Dim ip1 = BitConverter.ToUInt32(First_Usable_IP_Address.GetA ddressBytes.Reverse.ToArray, 0)
    Dim ip2 = BitConverter.ToUInt32(Last_Usable_IP_Address.GetAd dressBytes.Reverse.ToArray, 0)


    Show_Progress_Panel()
    Dim counter As Integer = 0
    Parallel.[For](ip1, ip2,
    Sub(x, loop_state)
    Dim ip As IPAddress = New IPAddress(BitConverter.GetBytes(CType(x, UInt32)).Reverse.ToArray)
    If IsAlive(ip) Then
    SyncLock Devices_list
    Dim dvc As New Device
    With dvc
    .HostName = Get_HostNameByIP(ip)
    .IP_Address = ip
    .MAC_Address = Get_MACAddressByIP(ip)
    .MAC_Vendor = Get_MACVendor(.MAC_Address)
    .Manufacturer = ""
    .Model = ""
    .ModelNumber = ""
    End With
    Devices_list.Add(dvc)
    StatusStrip1.BeginInvoke(Sub() Status_Label_Devices.Text = $"Live Devices={Devices_list.Count}")
    End SyncLock
    End If
    counter += 1
    BgWorker_Scan.ReportProgress(counter)
    Application.DoEvents()
    End Sub)
    End Sub



  25. #25
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

    نقل قول: بدست آوردن لیست کامپیوترهای متصل به شبکه محلی

    پروسه گرفتن اطلاعات upnp
        Private Sub BgWorker_UPNP_Info_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BgWorker_UPNP_Info.DoWork 
    UPNP_Done = False
    Dim DeviceFinder As New UPNPLib.UPnPDeviceFinder
    Dim UPNP_Devices As UPNPLib.UPnPDevices = DeviceFinder.FindByType("upnp:rootdevice", 0)


    For Each UPNP_Device As UPNPLib.UPnPDevice In UPNP_Devices
    Dim dvc As New Device
    With dvc
    .HostName = UPNP_Device.FriendlyName
    .Manufacturer = UPNP_Device.ManufacturerName
    .Model = UPNP_Device.ModelName
    .ModelNumber = UPNP_Device.ModelNumber
    .SerialNumber = UPNP_Device.SerialNumber
    If IsNothing(UPNP_Device.PresentationURL) Then
    .IP_Address = Nothing
    Else
    Dim regexp As New Text.RegularExpressions.Regex(pattern:="\d{1,3}\.\ d{1,3}\.\d{1,3}\.\d{1,3}")
    .IP_Address = IPAddress.Parse(regexp.Match(UPNP_Device.Presentat ionURL).Value)
    End If
    End With
    DevicesUPNP_list.Add(dvc)
    Next
    End Sub



  26. #26
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

    نقل قول: بدست آوردن لیست کامپیوترهای متصل به شبکه محلی

        Private Sub BgWorker_Scan_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles BgWorker_Scan.ProgressChanged 
    Status_Label.Text = $"{e.ProgressPercentage} of {Usable_Hosts_Count} ({FormatPercent(e.ProgressPercentage / Usable_Hosts_Count, 0)})"
    Update_ProgressBar(e.ProgressPercentage)
    End Sub

    Private Sub BgWorker_Scan_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BgWorker_Scan.RunWorkerCompleted
    Scan_Done = True
    If UPNP_Done Then
    Process_Completed()
    End If
    End Sub

    Private Sub BgWorker_UPNP_Info_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BgWorker_UPNP_Info.RunWorkerCompleted
    UPNP_Done = True
    If Scan_Done Then
    Process_Completed()
    End If
    End Sub



  27. #27
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

    نقل قول: بدست آوردن لیست کامپیوترهای متصل به شبکه محلی

    روتین پر کردن Devices_dt پس از پایان کار backgroundworker (ها)

        Sub Process_Completed() 
    For Each dvc As Device In Devices_list
    Dim dr As DataRow = Devices_dt.NewRow
    dr("Name") = dvc.HostName
    dr("IP Address") = dvc.IP_Address.ToString
    dr("Mac Address") = String.Join("-", dvc.MAC_Address.GetAddressBytes.Select(Function(x) $"{x:X2}").ToArray)
    dr("Mac Vendor") = dvc.MAC_Vendor
    Devices_dt.Rows.Add(dr)
    Next


    If CHK_Use_UPNP.Checked Then
    Update_Devices_Info_From_UPNP()
    End If


    Hide_Progress_Panel()
    DGV_Devices.Refresh()
    BTN_Scan.Enabled = True
    End Sub



  28. #28
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

    نقل قول: بدست آوردن لیست کامپیوترهای متصل به شبکه محلی

        Sub Update_Devices_Info_From_UPNP() 
    For Each item In DevicesUPNP_list
    If IsNothing(item.IP_Address) Then
    Dim fn As String = item.HostName.Split(":"c)(0)
    Dim drc As DataRow() = Devices_dt.Select($"Name='{fn}'")
    If drc.Length > 0 Then
    drc(0)("Name") = item.HostName
    drc(0)("Manufacturer") = item.Manufacturer
    drc(0)("Model") = item.Model
    drc(0)("ModelNumber") = item.ModelNumber
    drc(0)("SerialNumber") = item.SerialNumber
    End If
    Else
    Dim drc As DataRow() = Devices_dt.Select($"[IP Address]='{item.IP_Address}'")
    If drc.Length > 0 Then
    drc(0)("Name") = item.HostName
    drc(0)("Manufacturer") = item.Manufacturer
    drc(0)("Model") = item.Model
    drc(0)("ModelNumber") = item.ModelNumber
    drc(0)("SerialNumber") = item.SerialNumber
    End If
    End If
    Next
    End Sub



  29. #29
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

    نقل قول: بدست آوردن لیست کامپیوترهای متصل به شبکه محلی

    انتخاب اینترفیس:
        Private Sub DGV_NICs_RowEnter(sender As Object, e As DataGridViewCellEventArgs) Handles DGV_NICs.RowEnter 
    Calc_Addresses(e.RowIndex)
    If Usable_Hosts_Count > 0 Then
    BTN_Scan.Text = $"Scan From {First_Usable_IP_Address} To {Last_Usable_IP_Address}"
    BTN_Scan.Enabled = True
    Else
    BTN_Scan.Text = "No IP available to ping"
    BTN_Scan.Enabled = False
    End If
    End Sub

  30. #30
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

    نقل قول: بدست آوردن لیست کامپیوترهای متصل به شبکه محلی

        Private Sub BTN_Get_NICs_Click(sender As Object, e As EventArgs) Handles BTN_Get_NICs.Click 
    Get_LanInterfaces()
    End Sub

    Private Sub BTN_Scan_Click(sender As Object, e As EventArgs) Handles BTN_Scan.Click
    Devices_dt.Clear()
    Devices_list.Clear()
    DevicesUPNP_list.Clear()
    Show_Progress_Panel()
    BgWorker_Scan.RunWorkerAsync()
    If CHK_Use_UPNP.Checked Then
    BgWorker_UPNP_Info.RunWorkerAsync()
    Else
    UPNP_Done = True
    End If
    End Sub



  31. #31
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

    نقل قول: بدست آوردن لیست کامپیوترهای متصل به شبکه محلی

        Sub Show_Progress_Panel() 
    DGV_NICs.Enabled = False
    TableLayoutPanel1.Enabled = False
    StatusStrip1.BeginInvoke(Sub()
    Status_Label.Text = ""
    Status_Label_Devices.Text = ""
    With Status_ProgressBar
    .Minimum = 1
    .Maximum = Usable_Hosts_Count
    .Value = 1
    .Step = 1
    .Visible = True
    End With
    End Sub)
    End Sub


    Sub Hide_Progress_Panel()
    StatusStrip1.BeginInvoke(Sub()
    Status_ProgressBar.Visible = False
    Status_Label.Text = ""
    Status_Label_Devices.Text = ""
    End Sub)
    TableLayoutPanel1.Enabled = True
    DGV_NICs.Enabled = True
    End Sub


    Sub Update_ProgressBar(value As Integer)
    StatusStrip1.BeginInvoke(Sub() Status_ProgressBar.Value = value)
    End Sub

  32. #32
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

    نقل قول: بدست آوردن لیست کامپیوترهای متصل به شبکه محلی

    فایلهای فرم و دیتابیس سازندگان،
    کافی هست به پروژه خودتون اضافه کنین - و البته یک رفرنس به UPNPLib از کامپیوتر خودتون هم نیاز هست.
    فایل های ضمیمه فایل های ضمیمه

  33. #33
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

    نقل قول: بدست آوردن لیست کامپیوترهای متصل به شبکه محلی

    شات از برنامه :

    21.jpg

    20.jpg

  34. #34
    کاربر دائمی آواتار پرستو پارسایی
    تاریخ عضویت
    آبان 1392
    محل زندگی
    تهران
    پست
    458

    نقل قول: بدست آوردن لیست کامپیوترهای متصل به شبکه محلی

    نقل قول نوشته شده توسط mazoolagh مشاهده تاپیک
    تابع پینگ یک ip و برگرداندن true اگر پاسخ دریافت شود:
        Function IsAlive(address As IPAddress, Optional timeout As Integer = 100) As Boolean 
    Using pingSender As New Ping()
    Return pingSender.Send(
    address:=address,
    timeout:=timeout,
    buffer:=New Byte(31) {},
    options:=New PingOptions(ttl:=128, dontFragment:=True)
    ).Status = IPStatus.Success
    End Using
    End Function




    بسیار کار پر زحمتی انجام دادید . جسارتا اگر به این تابع آدرس یک دستگاهی که در شبکه نیست و یا آدرس نامعتبری مثل "1.2.3.4.5" را ارسال کنیم، خطای InvalidCastException خواهیم داشت. برای رفع این مشکل، می‌توان از یک شرط برای بررسی صحت آدرس استفاد کرد.

    Function IsAlive(address As IPAddress, Optional timeout As Integer = 100) As Boolean
    If address Is Nothing OrElse Not IPAddress.TryParse(address.ToString(), Nothing) Then
    Return False
    End If
    Using pingSender As New Ping()
    Return pingSender.Send(
    address:=address,
    timeout:=timeout,
    buffer:=New Byte(31) {},
    options:=New PingOptions(ttl:=128, dontFragment:=True)
    ).Status = IPStatus.Success
    End Using
    End Function

  35. #35
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

    نقل قول: بدست آوردن لیست کامپیوترهای متصل به شبکه محلی

    اگر به این تابع آدرس یک دستگاهی که در شبکه نیست و یا آدرس نامعتبری مثل "1.2.3.4.5" را ارسال کنیم، خطای InvalidCastException خواهیم داشت. برای رفع این مشکل، می‌توان از یک شرط برای بررسی صحت آدرس استفاد کرد.
    چون تابع isalive رو فقط برای شرایط همین برنامه نوشتم، بنابراین ip نادرست بهش پاس نمیشه.
    بخصوص که ip از نوع ipaddress هست و نه string یا عدد.
    یعنی ip قبلا ساخته شده و نمیتونه نادرست باشه مگر مستقیما هنگام پاس کردن با new ساخته بشه که در این صورت هم قبل از اجرای کد خود سیستم exception میگیره.

    ولی گفته شما در حالت کلی کاملا درسته و بهتر هست که اگر دامنه کابرد این تابع (یا هر روتین دیگه ای) بصورت public و برای همه شرایط باشه،
    از try-catch استفاده و در صورت خطای جدی هم throw exception کنیم.

تاپیک های مشابه

  1. پاسخ: 9
    آخرین پست: سه شنبه 14 مرداد 1393, 02:27 صبح
  2. پاسخ: 1
    آخرین پست: چهارشنبه 11 اردیبهشت 1392, 14:56 عصر
  3. بدست آوردن نام کامپیوترهای متصل به کامپیوتر
    نوشته شده توسط Mahbadgroup در بخش C#‎‎
    پاسخ: 4
    آخرین پست: سه شنبه 02 بهمن 1386, 11:24 صبح
  4. پاسخ: 2
    آخرین پست: سه شنبه 22 آبان 1386, 23:20 عصر
  5. بدست آوردن نام کامپیوترهای متصل به شبکه
    نوشته شده توسط once4ever در بخش C#‎‎
    پاسخ: 5
    آخرین پست: جمعه 21 مهر 1385, 14:31 عصر

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •