ถ้าจะใช้ C# การตรวจจับการ PING ใน cmd บน windows จะต้องเรียกใช้ API อะไร หรือมีรูปแบบการเขียนอย่างไรครับ
Code (VB.NET)
Dim s As New Stopwatch
s.Start()
Dim PingRe As Boolean = My.Computer.Network.Ping("192.168.1.1", 100)
s.Stop()
Text1.Text=s.Elapsed.ToString
s.Elapsed.จะใช้ ดอทอะไรลองศึกษาดูครับ
ปล.ผมมีแต่ที่ VB นะครับ ไม่ใช C# ลองเอาไปแปลงดู
Date :
2014-10-12 17:29:13
By :
zarooman
ก่อนที่ผมจะตอบ เอาหลักการก่อนนะครับ ที่ถามมาอาจจะผิดหลักรึเปล่าไม่แน่ใจ แต่มันก็ทำได้
ที่ถามว่า จะเอาผลลัพธ์จาก cmd ต้องถามก่อนว่าจะรู้ได้ไงว่าเป็น cmd ตัวไหน สมมติหากเปิดขึ้นมา 5 หน้าจอ ถ้าตามหลักแล้วจะตรวจสอบจาก Process ด้วยคำสั่งนี้
Code (C#)
foreach (System.Diagnostics.Process p in System.Diagnostics.Process.GetProcesses())
{
Debug.WriteLine(p.Id + ", " + p.ProcessName);
}
แบบนี้จะทราบว่า มี Process ที่เป็น cmd อยู่กี่อันในระบบ OS
ที่ผมสงสัยคือคุณต้องการดัก Listener Process จริงๆ เหรอครับ เพราะว่าโดยปกติเราจะสั่งเปิด cmd ภายใน C# เอง แล้วดักจับคำสังที่เราระบุตรงๆ เพราะถ้าเราสั่ง cmd ภายใน C# เราจะคุมทุอย่างได้เอง
ยกตัวอย่างแบบที่สั่งผ่าน C#
Code (C#)
private void PingDosProcess()
{
ProcessStartInfo cmdStartInfo = new ProcessStartInfo();
cmdStartInfo.FileName = @"C:\Windows\System32\cmd.exe";
cmdStartInfo.RedirectStandardOutput = true;
cmdStartInfo.RedirectStandardError = true;
cmdStartInfo.RedirectStandardInput = true;
cmdStartInfo.UseShellExecute = false;
cmdStartInfo.CreateNoWindow = true;
Process cmdProcess = new Process();
cmdProcess.StartInfo = cmdStartInfo;
cmdProcess.ErrorDataReceived += cmd_Error;
cmdProcess.OutputDataReceived += cmd_DataReceived;
cmdProcess.EnableRaisingEvents = true;
cmdProcess.Start();
cmdProcess.BeginOutputReadLine();
cmdProcess.BeginErrorReadLine();
cmdProcess.StandardInput.WriteLine("ping www.google.com");
cmdProcess.StandardInput.WriteLine("exit");
cmdProcess.WaitForExit();
}
private void cmd_DataReceived(object sender, DataReceivedEventArgs e)
{
Debug.WriteLine(e.Data);
}
private void cmd_Error(object sender, DataReceivedEventArgs e)
{
Debug.WriteLine("Error");
Debug.WriteLine(e.Data);
}
Date :
2014-10-12 17:49:59
By :
gunnermontana
คงต้องเอาไปปรับดูเพราะว่างานคุณจะเน้นแนว Network Programming ด้านล่างเป็นเพียงแค่ตัวช่วยในการหา MacAddress จาก IP Address เท่านั้น งานของคุณ Source Code จะเยอะครับ บางทีอาจต้องใช้ DLLImport ไปเขียน API ของ OS คงต้องศึกษากันยาวครับ
Code (C#)
public class NetworkHelper
{
private const int PING_TIMEOUT = 1000;
private static bool IsHostAccessible(string hostNameOrAddress)
{
Ping ping = new Ping();
PingReply reply = ping.Send(hostNameOrAddress, PING_TIMEOUT);
return reply.Status == IPStatus.Success;
}
public static string GetMacAddress(string ipAddress)
{
string macAddress = string.Empty;
if (!IsHostAccessible(ipAddress)) return null;
try
{
string filePath = Environment.GetFolderPath(Environment.SpecialFolder.Windows) + "\\sysnative";
ProcessStartInfo processStartInfo = new ProcessStartInfo();
Process process = new Process();
processStartInfo.FileName = filePath + "\\nbtstat";
processStartInfo.RedirectStandardInput = false;
processStartInfo.RedirectStandardOutput = true;
processStartInfo.Arguments = "-a " + ipAddress;
processStartInfo.UseShellExecute = false;
processStartInfo.CreateNoWindow = true;
process = Process.Start(processStartInfo);
int counter = -1;
while (counter <= -1)
{
counter = macAddress.Trim().ToLower().IndexOf("mac address", 0);
if (counter > -1) break;
macAddress = process.StandardOutput.ReadLine();
}
process.WaitForExit();
macAddress = macAddress.Trim();
}
catch (Exception e)
{
Console.WriteLine("Error :" + e.ToString());
}
return macAddress;
}
}
วิธีเรียกก็
Code (C#)
string macAddress = NetworkHelper.GetMacAddress("192.168.x.x");
Date :
2014-10-12 20:55:48
By :
gunnermontana
อิอิ ที่ทำงาน block youtube อ่ะ
Date :
2014-10-13 13:26:50
By :
ห้ามตอบเกินวันละ 2 กระทู้
"เราสามารถหา ip ของคนที่มาต่อของเราได้ใช่มั้ยครับในกรณีแบบนี้ ผมไม่รู้โค็ดที่จะเก็ทมันมา"
คือต้องออกตัวก่อนว่า ผมก็ไม่รู้ว่าคุณต้องการอะไรแบบไหนอะนะ ผมแนะนำได้แค่ว่า ถ้าเราต้องการ ip ของคนที่อยู่ในวงเดียวกับเรา ก็ให้ใช้ Source Code ด้านล่างนี้ อาจจะยาวหน่อยนะ
Code (C#)
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.NetworkInformation;
using System.Runtime.InteropServices;
public class NetworkHelper
{
[StructLayout(LayoutKind.Sequential)]
private struct MIB_IPNETROW
{
[MarshalAs(UnmanagedType.U4)]
public int dwIndex;
[MarshalAs(UnmanagedType.U4)]
public int dwPhysAddrLen;
[MarshalAs(UnmanagedType.U1)]
public byte mac0;
[MarshalAs(UnmanagedType.U1)]
public byte mac1;
[MarshalAs(UnmanagedType.U1)]
public byte mac2;
[MarshalAs(UnmanagedType.U1)]
public byte mac3;
[MarshalAs(UnmanagedType.U1)]
public byte mac4;
[MarshalAs(UnmanagedType.U1)]
public byte mac5;
[MarshalAs(UnmanagedType.U1)]
public byte mac6;
[MarshalAs(UnmanagedType.U1)]
public byte mac7;
[MarshalAs(UnmanagedType.U4)]
public int dwAddr;
[MarshalAs(UnmanagedType.U4)]
public int dwType;
}
[DllImport("IpHlpApi.dll")]
[return: MarshalAs(UnmanagedType.U4)]
private static extern int GetIpNetTable(IntPtr pIpNetTable, [MarshalAs(UnmanagedType.U4)] ref int pdwSize, bool bOrder);
private const int ERROR_INSUFFICIENT_BUFFER = 122;
public static Dictionary<IPAddress, PhysicalAddress> GetAllDevicesOnLAN()
{
Dictionary<IPAddress, PhysicalAddress> all = new Dictionary<IPAddress, PhysicalAddress>();
all.Add(GetIPAddress(), GetMacAddress());
int spaceForNetTable = 0;
GetIpNetTable(IntPtr.Zero, ref spaceForNetTable, false);
IntPtr rawTable = IntPtr.Zero;
try
{
rawTable = Marshal.AllocCoTaskMem(spaceForNetTable);
int errorCode = GetIpNetTable(rawTable, ref spaceForNetTable, false);
if (errorCode != 0)
{
throw new Exception(string.Format("Unable to retrieve network table. Error code {0}", errorCode));
}
int rowsCount = Marshal.ReadInt32(rawTable);
IntPtr currentBuffer = new IntPtr(rawTable.ToInt64() + Marshal.SizeOf(typeof(Int32)));
MIB_IPNETROW[] rows = new MIB_IPNETROW[rowsCount];
for (int index = 0; index < rowsCount; index++)
{
rows[index] = (MIB_IPNETROW)Marshal.PtrToStructure(
new IntPtr(currentBuffer.ToInt64() + (index * Marshal.SizeOf(typeof(MIB_IPNETROW)))), typeof(MIB_IPNETROW));
}
PhysicalAddress virtualMAC = new PhysicalAddress(new byte[] { 0, 0, 0, 0, 0, 0 });
PhysicalAddress broadcastMAC = new PhysicalAddress(new byte[] { 255, 255, 255, 255, 255, 255 });
foreach (MIB_IPNETROW row in rows)
{
IPAddress ip = new IPAddress(BitConverter.GetBytes(row.dwAddr));
byte[] rawMAC = new byte[] { row.mac0, row.mac1, row.mac2, row.mac3, row.mac4, row.mac5 };
PhysicalAddress pa = new PhysicalAddress(rawMAC);
if (!pa.Equals(virtualMAC) && !pa.Equals(broadcastMAC) && !IsMulticast(ip))
{
if (!all.ContainsKey(ip)) all.Add(ip, pa);
}
}
}
finally
{
Marshal.FreeCoTaskMem(rawTable);
}
return all;
}
private static IPAddress GetIPAddress()
{
String strHostName = Dns.GetHostName();
IPHostEntry ipEntry = Dns.GetHostEntry(strHostName);
IPAddress[] addr = ipEntry.AddressList;
foreach (IPAddress ip in addr)
{
if (!ip.IsIPv6LinkLocal) return (ip);
}
return addr.Length > 0 ? addr[0] : null;
}
private static PhysicalAddress GetMacAddress()
{
foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
{
if (nic.NetworkInterfaceType == NetworkInterfaceType.Ethernet &&
nic.OperationalStatus == OperationalStatus.Up)
{
return nic.GetPhysicalAddress();
}
}
return null;
}
private static bool IsMulticast(IPAddress ip)
{
bool result = true;
if (!ip.IsIPv6Multicast)
{
byte highIP = ip.GetAddressBytes()[0];
if (highIP < 224 || highIP > 239) result = false;
}
return result;
}
}
ถ้าจะเขียน Network Programming ก็ต้องรู้วิชา Distributed Network ทางทฤษฎีด้วย แต่หลักการคงไม่แตกต่างกันมากนัก ส่วน Code ด้านบนเป็นเพียงส่วนเดียว ผมก็เอามาปรับให้แล้วนะครับ สิ่งที่คุณต้องรู้ก็คือ การเรียกใช้ DLLImport การดึง Address จาก Marshal Interop ผมคิดว่าคุณเอา Code ไป ก็ไม่เข้าใจอยู่ดี
ส่วนวิธีใช้งาน (ต้องบอกมั้ยครับ)
Code (C#)
// ฟังก์ชั่นการแปลงรูปแบบ MacAddress อันนี้ก็พื้นๆ เขียน Get Byte ธรรมดา
private string GetMacAddressFormat(PhysicalAddress address)
{
string macAddress = string.Empty;
byte[] bytes = address.GetAddressBytes();
for (int i = 0; i < bytes.Length; i++)
{
macAddress += bytes[i].ToString("X2");
if (i != bytes.Length - 1) macAddress += "-";
}
return macAddress;
}
// เรียกใช้ ก็ดึงมาปกติ
Dictionary<IPAddress, PhysicalAddress> allDevices = NetworkHelper.GetAllDevicesOnLAN();
foreach (KeyValuePair<IPAddress, PhysicalAddress> device in allDevices)
{
/*
// ที่ comment เพราะว่า ผมลองเรียก GetHostEntry เพื่อจะเอาชื่อเครื่องคอมพิวเตอร์ด้วย
// แต่บางเครื่องก็เรียกไม่ได้ มันมีเหตุผลขอองมันอยู่ ก็เลย catch ไว้ ซึ่งการเรียกแบบนี้จะช้ากว่าแบบไม่เรียกใช้
try
{
IPHostEntry hostEntry = Dns.GetHostEntry(device.Key);
Debug.WriteLine("IP: {0}, MAC: {1}, Com: {2}", device.Key, GetMacAddressFormat(device.Value), hostEntry.HostName);
}
catch
{
Debug.WriteLine("IP: {0}, MAC: {1}", device.Key, GetMacAddressFormat(device.Value));
}
*/
// ถ้าไม่เรียกอะไรเลย ก็ดึงค่ามาแสดงตรงๆ แบบนี้จะเร็ว
Debug.WriteLine("IP: {0}, MAC: {1}", device.Key, GetMacAddressFormat(device.Value));
}
Date :
2014-10-13 14:42:12
By :
gunnermontana
ปล. วันฯมีแต่เบี้ยประชุม/เบี้ยสัมมะนา/ขยันเป็นวิทยากร (บิลเกตต เคือง)
ประวัติการแก้ไข 2014-10-13 21:51:45
Date :
2014-10-13 21:49:26
By :
หน้าฮี
Load balance : Server 01