原文地址:http://blog.csdn.net/yulinlover/archive/2009/02/08/3868824.aspx
public class NativeFunc


{
[StructLayout(LayoutKind.Sequential)]
public class MIB_TCPROW

{
public int dwState;
public int dwLocalAddr;
public int dwLocalPort;
public int dwRemoteAddr;
public int dwRemotePort;
}
[StructLayout(LayoutKind.Sequential)]
public class MIB_TCPTABLE

{
public int dwNumEntries;
public MIB_TCPROW[] table;
}
[DllImport("Iphlpapi.dll")]
static extern int GetTcpTable(IntPtr pTcpTable, ref int pdwSize, bool bOrder);
[DllImport("Iphlpapi.dll")]
static extern int SendARP(Int32 DestIP, Int32 SrcIP, ref Int64 MacAddr, ref Int32 PhyAddrLen);
[DllImport("Ws2_32.dll")]
static extern Int32 inet_addr(string ipaddr);
[DllImport("Ws2_32.dll")]
static extern ushort ntohs(ushort netshort);
//SendArp獲取MAC地址
public static string GetMacAddress(string macip)

{
StringBuilder strReturn = new StringBuilder();
try

{
Int32 remote = inet_addr(macip);
Int64 macinfo = new Int64();
Int32 length = 6;
SendARP(remote, 0, ref macinfo, ref length);
string temp = System.Convert.ToString(macinfo, 16).PadLeft(12, '0').ToUpper();
int x = 12;
for (int i = 0; i < 6; i++)

{

if (i == 5)
{ strReturn.Append(temp.Substring(x - 2, 2)); }

else
{ strReturn.Append(temp.Substring(x - 2, 2) + ":"); }
x -= 2;
}
return strReturn.ToString();
}
catch

{
return string.Empty;
}
}
public static bool IsHostAlive(string strHostIP)

{
string strHostMac = GetMacAddress(strHostIP);
return !string.IsNullOrEmpty(strHostMac);
}
public static MIB_TCPTABLE GetTcpTableInfo()

{
//聲明一個指針準備接受Tcp連接信息
IntPtr hTcpTableData = IntPtr.Zero;
//聲明hTcpTableData指針所指向的內存緩沖區大小
int iBufferSize = 0;
//聲明MIB_TCPTABLE對象,作為返回值
MIB_TCPTABLE tcpTable = new MIB_TCPTABLE();
//聲明一個List對象來臨時存放MIB_TCPROW對象
List<MIB_TCPROW> lstTcpRows = new List<MIB_TCPROW>();
//調用API來獲得真正的緩沖區大小,iBufferSize默認為0,
//這時調用API GetTcpTable會觸發一個異常ERROR_INSUFFICIENT_BUFFER
//通過這個異常系統會把真正的緩沖長度返回
GetTcpTable(hTcpTableData, ref iBufferSize, false);
//為托管指針在堆上分配內存
hTcpTableData = Marshal.AllocHGlobal(iBufferSize);
//求得MIB_TCPROW對象的內存字節數
int iTcpRowLen = Marshal.SizeOf(typeof(MIB_TCPROW));
//根據上面得到的緩沖區大小來推算MIB_TCPTABLE里的MIB_TCPROW數組長度
//下面用緩沖長度-sizeof(int)也就是去掉MIB_TCPTABLE里的成員dwNumEntries所占用的內存字節數
int aryTcpRowLength = (int)Math.Ceiling((double)(iBufferSize - sizeof(int)) / iTcpRowLen);
//重新取得TcpTable的數據
GetTcpTable(hTcpTableData, ref iBufferSize, false);
//下面是關鍵,由于MIB_TCPTABLE里的成員有一個是數組,而這個數組長度起初我們是不能確定的
//所以這里我們只能根據分配的指針來進行一些運算來推算出我們所要的數據
for (int i = 0; i < aryTcpRowLength; i++)

{
//hTcpTableData是指向MIB_TCPTABLE緩沖區的內存起始區域,由于其成員數據在內存中是順序排列
//所以我們可以推斷hTcpTableData+4(也就是sizeof(dwNumEntries)的長度)后就是MIB_TCPROW數組的第一個元素
IntPtr hTempTableRow = new IntPtr(hTcpTableData.ToInt32() + 4 + i * iTcpRowLen);
MIB_TCPROW tcpRow = new MIB_TCPROW();
tcpRow.dwLocalAddr = 0;
tcpRow.dwLocalPort = 0;
tcpRow.dwRemoteAddr = 0;
tcpRow.dwRemotePort = 0;
tcpRow.dwState = 0;
//把指針數據拷貝到我們的結構對象里。
Marshal.PtrToStructure(hTempTableRow, tcpRow);
lstTcpRows.Add(tcpRow);
}
tcpTable.dwNumEntries = lstTcpRows.Count;
tcpTable.table = new MIB_TCPROW[lstTcpRows.Count];
lstTcpRows.CopyTo(tcpTable.table);
return tcpTable;
}
public static string GetIpAddress(long ipAddrs)

{
try

{
System.Net.IPAddress ipAddress = new System.Net.IPAddress(ipAddrs);
return ipAddress.ToString();
}

catch
{ return ipAddrs.ToString(); }
}
public static ushort GetTcpPort(int tcpPort)

{
return ntohs((ushort)tcpPort);
}
public static bool IsPortBusy(int port)

{
MIB_TCPTABLE tcpTableData = GetTcpTableInfo();
return false;
}
}
下面我再把調用的方式順便寫一下
private void button1_Click(object sender, EventArgs e)


{
NativeFunc.MIB_TCPTABLE tcpTableData = new NativeFunc.MIB_TCPTABLE();
tcpTableData = NativeFunc.GetTcpTableInfo();
for (int i = 0; i < tcpTableData.dwNumEntries; i++)

{
this.richTextBox1.AppendText(string.Format("{0}:{1}-->>{2}:{3}\n",
NativeFunc.GetIpAddress(tcpTableData.table[i].dwLocalAddr),
NativeFunc.GetTcpPort(tcpTableData.table[i].dwLocalPort).ToString(),
NativeFunc.GetIpAddress(tcpTableData.table[i].dwRemoteAddr),
NativeFunc.GetTcpPort(tcpTableData.table[i].dwRemotePort).ToString()));
}
}
代碼下載 也可以使用cmd命令,Netstat
具體參考:
http://www.cnblogs.com/honour/archive/2008/08/04/1260206.html
posted on 2010-06-13 17:12
漂漂 閱讀(1673)
評論(0) 編輯 收藏 引用 所屬分類:
c#開發