|
|
|
VB.Net 2010 โปแกรม ค้นหาไอพีในวงแลน เกิด error |
|
|
|
|
|
|
|
Error Message ว่าอะไรครับ ?
|
|
|
|
|
Date :
2014-12-16 11:49:32 |
By :
mr.win |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Option Explicit On
Public Class Form1
' นับจำนวน IP Address ที่ตรวจพบ
Dim CountIP As Long
' เก็บค่า IP ชุดสุดท้ายของค่าเริ่มต้นเอาไว้ เช่น 192.168.0.1 จะเก็บค่า 1
Dim IPStartScan As Integer
' เก็บค่า IP ชุดสุดท้ายของค่าสิ้นสุดเอาไว้ เช่น 192.168.0.254 จะเก็บค่า 254
Dim IPEndScan As Integer
' เก็บค่า IP 3 ชุดแรก เช่น 192.168.0.254 จะเก็บค่า 192.168.0 เอาไว้
Dim strIP As String
' ตัวแปรเก็บค่าสถานะของการ Scan หา IP
' หากเป็นจริง สถานะกำลัง Scan
' หากเป็นเท็จ สถานะหยุดการ Scan
Dim blnScan As Boolean
Private Const AF_INET = 2
Private Declare Function inet_addr Lib "wsock32.dll" (ByVal addr As String) As Long
Private Declare Function gethostbyaddr Lib "wsock32.dll" (addr As Long, ByVal addr_len As Long, ByVal addr_type As Long) As Long
Private Declare Function WSAGetLastError Lib "wsock32.dll" () As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Structure HOSTENT
hName As Long
hAliases As Long
hAddrType As Integer
hLen As Integer
hAddrList As Long
End Structure
Public Function IPtoDNS(ByVal sRemoteIP As String) As String
' ###################################################
On Error GoTo ErrorHandler
' ประกาศให้ตัวแปร Host เรียกใช้ไปยังโครงสร้าง HOSTENT
Dim Host As HOSTENT
Dim dwRemoteIP As Long
' ทดสอบหาการชี้ตำแหน่ง Memory Address ของ Remote IP
Dim lngTemp As Long
' เก็บชื่อของ HostName เอาไว้
Dim strHostName As String
' เปลี่ยนค่า IP เป็นค่าตัวเลขแบบ Long ก่อน ด้วยฟังค์ชั่น inet_addr ให้สังเกตด้วยว่าเจ้าตัวนี้มันเป็น API
dwRemoteIP = inet_addr(sRemoteIP)
' ให้ Pointer ชี้ไปยังโครงสร้างของ HOSTENT
' ซึ่งจะเก็บข้อมูลที่เกี่ยวกับที่เกี่ยวข้องกับ Network
lngTemp = gethostbyaddr(dwRemoteIP, 4, AF_INET)
' หากค้นหาตำแหน่งที่เก็บข้อมูลของ Network Address ได้ (ในโครงสร้าง HOSTENT)
If lngTemp <> 0 Then
' ชี้ตำแหน่ง Memory Address ที่เก็บข้อมูลของ Network ตามโครงสร้าง HOSTENT
' โดยที่มันจะชี้จุดเริ่มต้นตำแหน่งปลายทาง, จุดเริ่มต้นตำแหน่งต้นทาง และ ความยาวข้อมูลที่ต้องการ
' ขอให้สังเกตด้วยว่าเป็นการชี้ไปที่ Memory Address ของปลายทาง (Host) (ที่ๆเราจะคัดลอกข้อมูลไปเก็บ)
' แต่เอาค่า (ByVal) ของ lngTemp ไปเก็บที่ Memory Address ของ Host ตามขนาด Len(Host)
CopyMemory Host, ByVal lngTemp, Len(Host)
' นั่นก็คือ เอาข้อมูลของเครื่องปลายทาง ไปเก็บไว้ในหน่วยความจำที่ใดที่หนึ่งก่อน
' จองพื้นที่ในการเก็บค่า Host Name จำนวน 256 ตัวอักขระ โดยใส่ค่า ASCII Code CHR(0) เอาไว้ก่อน
' ค่านี้ก็คือ NULL นั่นเอง ที่ต้องทำอย่างนี้ เพราะเราไม่รู้ค่าความยาวที่แน่นอนของ Host Name
' ดังนั้นเมื่อได้ค่ามายาวเท่าไรก็ตาม ก็จะตัดค่าที่เป็น NULL ทิ้งออกไปตั้งแต่ที่พบตัวแรกเลย ตามคำสั่ง
' Left(strHostName, InStr(strHostName, Chr(0)) - 1)
' หรือ อาจจะเรียกได้ว่าเป็นเทคนิคของการตัดคำที่เราไม่รู้ค่าความยาวที่แน่นอนครับ
' การจะใช้ค่าอื่น ที่ไม่ใช่ CHR(0) อาจจะทำให้เกิดข้อผิดพลาดได้
strHostName = String(256, 0)
' อ่านค่า Host Name จาก Memory Address โดยเอาเฉพาะ hName มาเท่านั้น
' เป็นการเรียกผ่านตัวแปรโครงสร้าง Host น่ะครับ ... สังเกตให้ดีด้วย
' เอาค่า (ByVal) จาก Memory Address ของต้นทาง Host.hName
' ไปไว้ในตัวแปร strHostName (ตัวแปรตัวนี้มันจะมี Memory Address อะไรก็ช่างหัวมัน)
CopyMemory ByVal strHostName, ByVal Host.hName, 256
' นำข้อมูลของเครื่องปลายทางที่เคยเก็บเอาไว้ ก็ให้นำออกมาแสดงผล
' เรื่องของ Pointer ใน VB6 ... ก็ค่อยๆไล่แกะไปน่ะครับผม สู้ๆ
' หากไม่พบข้อมูลของ Network Address จะส่งรหัสความผิดพลาดไปที่ WSAGetLastError()
' เพื่อที่จะได้แจ้งกลับมาว่าเกิดข้อผิดพลาดประการใดขึ้นมา
If strHostName = "" Then
IPtoDNS = "DNS Error : " & Str$(WSAGetLastError())
' พบข้อมูลของ Network Address
Else
' ให้อ่านค่า DNS จากซ้ายไปขวา จนกว่าจะเจอรหัส ASCII Code CHR(0) หรือ ค่า NULL
' เมื่อพบแล้วให้ลบออก 1 ไม่งั้น CHR(0) มันจะติดเข้ามาด้วยครับ
IPtoDNS = Left(strHostName, InStr(strHostName, Chr(0)) - 1)
End If
' หากระบุ DNS ไม่ได้ ส่วนใหญ่จะเป็นพวกอุปกรณ์สื่อสาร เช่น Modem, Router
' ค่า lngTemp จะมีค่าเป็น 0
Else
IPtoDNS = "ไม่สามารถระบุ DNS ได้"
End If
ExitProc:
Exit Function
ErrorHandler:
' ขณะโปรแกรมกำลังทำงาน (Run Time) ดัก Error จาก On Error GoTo ErrorHandler
If Err.Number <> 0 Then MsgBox("Error " & Err.Number & vbCrLf & Err.Description)
Resume ExitProc
End Function
Private Sub btnStop_Click(sender As System.Object, e As System.EventArgs) Handles btnStop.Click
btnScan.Enabled = False
End Sub
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
Timer1.Enabled = False
txtip1.Text = "192"
txtip2.Text = "168"
txtip3.Text = "0"
txtip4.Text = "0"
txtipE1.Text = "192"
txtipE2.Text = "168"
txtipE3.Text = "0"
txtipE4.Text = "255"
txtPort.Text = "80"
txtScan.Text = ""
btnStop.Enabled = False
End Sub
Private Sub btnScan_Click(sender As System.Object, e As System.EventArgs) Handles btnScan.Click
On Error GoTo ErrorHandler
' เคลียร์ข้อมูล Status Bar ช่องแรก
ToolStripStatusLabel1.Text = ""
' เคลียร์ค่า TextBox ในการแสดงผลหมายเลข IP Address
txtScan.Text = ""
' เคลียร์ค่าการนับจำนวน IP
CountIP = 0
' กำหนดช่วงเวลาในการ Scan หา IP Address มีหน่วยเป็นมิลลิวินาที โดย 1000 ms = 1 วินาที
' บางครั้งก็อาจจะต้องกำหนดให้ใช้เวลานาน เพราะมันขึ้นกับสายและระยะทาง หรืออื่นๆ ด้วยน่ะครับ
Timer1.Interval = 100
' หาก IP ชุดสุดท้ายไม่เป็นค่าว่าง
If Trim(txtipE4.Text) <> "" Or Len(Trim(txtipE4.Text)) = 0 Then
btnScan.Enabled = False
btnStop.Enabled = True
' แจ้งหมายเลข Port
txtScan.Text = txtScan.Text & "ตรวจสอบหมายเลข Port: " & txtPort.Text & vbCrLf
' กำหนดค่าหมายเลข IP ในการเริ่มต้น Scan หา เอาเฉพาะ 3 ชุดแรก เช่น 192.168.0
' แล้วค่อยๆทำการนับหมายเลขชุดสุดท้ายขึ้นไปทีละ 1
strIP = txtip1.Text & "." & txtip2.Text & "." & txtip3.Text
' กำหนดหมายเลข IP Address เริ่มต้น (ชุดสุดท้าย)
IPStartScan = txtip4.Text
' กำหนดหมายเลข IP ที่สิ้นสุด (ชุดสุดท้าย)
IPEndScan = txtipE4.Text
' ขณะนี้กำลังทำการ Scan เมื่อไรก็ตามที่ค่านี้มีค่าเป็น False ก็จะหยุดการทำงานลงทันที
blnScan = True
' กระตุ้นนาฬิกาให้ทำงานต่อไป
Timer1.Enabled = True
End If
ExitProc:
Exit Sub
ErrorHandler:
' ขณะโปรแกรมกำลังทำงาน (Run Time) ดัก Error จาก On Error GoTo ErrorHandler
If Err.Number <> 0 Then MsgBox("Error: " & Err.Number & vbCrLf & Err.Description)
Resume ExitProc
End Sub
Private Sub ScanIP()
On Error GoTo ErrorHandler
' เงื่อนไขให้ Scan เมื่อ IP ชุดสุดท้ายของค่าเริ่มต้น ยังน้อยกว่าหรือเท่ากับ IP ชุดสุดท้ายของค่าสิ้นสุด
' และ ยังไม่มีการกดปุ่ม cmdStop ให้หยุดการทำงาน
If IPStartScan <= IPEndScan And blnScan = True Then
' ให้ CPU ไปทำงานอย่างอื่นได้เลย (คืน CPU กลับไปให้กับระบบปฏิบัติการ - OS)
Application.DoEvents()
' หาก Winsock ยังมีการ Connect กับ IP ใดๆอยู่ ต้องสั่งให้ Disconnect ออกไปก่อน
If wsIP.State <> sckClosed Then wsIP.Close()
' ###################################################
' ส่วนสำคัญที่กำหนดค่าเพื่อทำการทดสอบ
' กำหนด IP ให้กับ Winsock เมื่อ
' strIP เก็บค่า IP 3 ชุดแรก เช่น 192.168.0.111 ก็จะเก็บค่า 192.168.0 เอาไว้
' IPStartScan เก็บค่า IP ชุดสุดท้าย หรือ IP ที่กำลังตรวจสอบการ Connect กับ Winsock
wsIP.RemoteHost = strIP & "." & IPStartScan
' กำหนดหมายเลข Port ในการติดต่อกับ Remote IP
wsIP.RemotePort = txtPort.Text
' Winsock ติดต่อหมายเลข IP Address และ หมายเลข Port ตามที่กำหนด
' หวกสามารถติดต่อ IP Address และ Port ที่กำหนดได้ ก็จะกระโดดไปเหตุการณ์ wsIP_Connect()
' หากว่ามันติดต่อกับเครื่องปลายทางไม่ได้ มันก็จะไม่กระโดดไปในเหตุการณ์ Connect น่ะครับ
' จากนั้นเราก็ให้มันแสดงผลตามหมายเลข IP Address ออกมายังไงล่ะครับ
' จะเห็นการทำงานในส่วนนี้ได้ คุณต้องทำการ Debug ดูด้วยน่ะครับ ...
wsIP.Connect()
' ###################################################
' เพิ่มค่า IP ในการ Scan ขึ้นอีก 1
IPStartScan = IPStartScan + 1
' Scan หา IP Address ครบแล้ว หรือ สั่งให้หยุดการ Scan
Else
btnScan.Enabled = True
btnStop.Enabled = False
' สั่งให้ Timer1 หยุดการทำงานด้วย
Timer1.Enabled = False
' รายงานผลการ Scan IP Address ใน StatusBar
If IPStartScan <= IPEndScan Then
ToolStripStatusLabel1.Text = "หยุดการทำงานที่ IP: " & IPStartScan
' กรณี Scan IP Address เสร็จสมบูรณ์หมดแล้ว
Else
ToolStripStatusLabel1.Text = "การทำงานเสร็จสมบูรณ์ - " & CountIP & " IP Address"
MsgBox("Scan หา IP ในระบบได้ " & CountIP & " หมายเลข - Port " & txtPort.Text)
End If
End If
ExitProc:
Exit Sub
ErrorHandler:
' ขณะโปรแกรมกำลังทำงาน (Run Time) ดัก Error จาก On Error GoTo ErrorHandler
If Err.Number <> 0 Then MsgBox("Error " & Err.Number & vbCrLf & Err.Description)
Resume ExitProc
End Sub
Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
ToolStripStatusLabel1.Text = "กำลังประมวลผล IP: " & strIP & "." & IPStartScan
' ไป Scan หา IP Address หรือ
' ตรวจสอบการ Connect IP Address กับ Winsock Control นั่นแหละครับ
Call ScanIP()
End Sub
Private Sub wsIP_Connect()
' ###################################################
On Error GoTo ErrorHandler
' แสดงหมายเลข IP Address และ DNS
txtScan.Text = txtScan.Text & "IP : " & wsIP.RemoteHost & " - " & IPtoDNS(wsIP.RemoteHost) & vbCrLf
' นับจำนวน IP Address ที่ตรวจพบ
CountIP = CountIP + 1
ExitProc:
Exit Sub
ErrorHandler:
' ขณะโปรแกรมกำลังทำงาน (Run Time) ดัก Error จาก On Error GoTo ErrorHandler
If Err.Number <> 0 Then MsgBox("Error " & Err.Number & vbCrLf & Err.Description)
Resume ExitProc
End Sub
End Class
|
|
|
|
|
Date :
2014-12-17 08:32:21 |
By :
nankittiphat |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
สิ่งที่มันฟ้อง error พอดีผมมือใหม่หัดขับ
|
|
|
|
|
Date :
2014-12-17 08:35:12 |
By :
nankittiphat |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
โอ้ Error เยอะเหลือเกินครับ ว่าแต่ Code นี้มันไม่ใช่ของ VB6 เหรอครับ
|
|
|
|
|
Date :
2014-12-17 09:27:34 |
By :
mr.win |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ลองเอาไปแก้ดูครับผมเพิ่งลองทำตะกี้เองเอาไปปรับเอาละกัน
หลักๆก็จะมีพวก IP,MacAddress,Hostname,status ประมาณนี้ครับ
Code (C#)
namespace IPScaner
{
public class SetIP {
public string IP; public string MacAddress; public IPHostEntry IpEntry; public PingReply reply;
public SetIP(string ip,string mac,IPHostEntry ipE,PingReply pr)
{
IP = ip; MacAddress = mac; IpEntry = ipE; reply = pr;
}
}
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
Ping ping = new Ping();
//ตรวจ IP
List<SetIP> setIP = new List<SetIP>();
for (int i = 1; i < 255; i++)
{
string ip = "192.168.13." + i;
setIP.Add(new SetIP(ip, GetMacAddress(ip), Dns.GetHostEntry(ip), ping.Send(ip)));
}
//นำไปใช้งาน
for (int i = 0; i < setIP.Count; i++)
{
textBox1.Text +=
"IP:" + setIP[i].IP +
"Status:" + setIP[i].reply.Status +
"MacAddress:" + setIP[i].MacAddress +
"Time to live:" + setIP[i].reply.Options.Ttl +
"Host Name:" + setIP[i].IpEntry.HostName + Environment.NewLine;
}
}
public string GetMacAddress(string ipAddress)
{
string macAddress = string.Empty;
System.Diagnostics.Process pProcess = new System.Diagnostics.Process();
pProcess.StartInfo.FileName = "arp";
pProcess.StartInfo.Arguments = "-a " + ipAddress;
pProcess.StartInfo.UseShellExecute = false;
pProcess.StartInfo.RedirectStandardOutput = true;
pProcess.StartInfo.CreateNoWindow = true;
pProcess.Start();
string strOutput = pProcess.StandardOutput.ReadToEnd();
string[] substrings = strOutput.Split('-');
if (substrings.Length >= 8)
{
macAddress = substrings[3].Substring(Math.Max(0, substrings[3].Length - 2))
+ "-" + substrings[4] + "-" + substrings[5] + "-" + substrings[6]
+ "-" + substrings[7] + "-"
+ substrings[8].Substring(0, 2);
return macAddress;
}
else
{
return "not found";
}
}
}
}
|
|
|
|
|
Date :
2014-12-17 10:27:35 |
By :
lamaka.tor |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ขอบคุณครับผม เดียวจะลองแก้ดูครับ
ได้ไม่ได้ยังงัยเดียวผมตอบครับผม
|
|
|
|
|
Date :
2014-12-17 10:47:25 |
By :
nankittiphat |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
เหอะๆๆๆลองแล้วไปไม่ถูกครับ พอจะมีตัวอย่างเป็น vb บ้างมัยครับ ดัดแปลงไม่เป็นอะครับผม
|
|
|
|
|
Date :
2014-12-17 11:13:51 |
By :
nankittiphat |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
C# to vb ลองค้นใน google ดูครับ(covert C# to vb or vb to C#)
แต่ถ้าอยากค้นเอง
vb.net ping IP
vb.net MacAddress
ใช้ค้นได้
|
|
|
|
|
Date :
2014-12-17 14:01:17 |
By :
lamaka.tor |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Load balance : Server 05
|