c# 获取MAC IP TCP列表
转载自baidu:http://hi.baidu.com/jackeyrain/item/ff94efcfd5cf3a3099b498e9
namespace Public
{ 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;
}
} public class MyApp
{
//调用
public static void Main()
{
NativeFunc.MIB_TCPTABLE tcpTableData = new NativeFunc.MIB_TCPTABLE();
tcpTableData = NativeFunc.GetTcpTableInfo();
for (int i = 0; i < tcpTableData.dwNumEntries; i++)
{
Console.WriteLine(string.Format("{0}:{1}-->>{2}:{3}",
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()));
}
Console.Read();
}
}
}
c# 获取MAC IP TCP列表的更多相关文章
- Qt之获取本机网络信息(MAC, IP等等,很全)
经常使用命令行来查看一些计算机的配置信息. 1.首先按住键盘上的“开始键+R键”,然后在弹出的对话框中输入“CMD”,回车 另外,还可以依次点击 开始>所有程序>附件>命令提示符 2 ...
- Java获取电脑IP、MAC、各种版本
Java代码获取电脑IP.MAC.各种版本 package com.rapoo.middle.action; import java.io.BufferedReader; import java.io ...
- 如何获取公网IP的mac地址
如何获取远程IP的mac地址 思路分析 由于java本身没有相关的jar包进行获取,所以这里介绍从其他的方面进行入手和实践 使用的工具对比: tcpdump tshark pcap4j 都可以达到抓包 ...
- java获取服务器IP地址及MAC地址的方法
这篇文章主要介绍了java编程实现获取机器IP地址及MAC地址的方法,实例分析了Java分别针对单网卡及多网卡的情况下获取服务器IP地址与MAC地址的相关技巧,需要的朋友可以参考下 本文实例讲述了 ...
- Python获取本机的mac,ip,name
Python获取mac 获取计算机名字和ip(内网ip) 指定网卡ip
- 获取Mac、CPUID、硬盘序列号、本地IP地址、外网IP地址OCX控件
提供获取Mac.CPUID.硬盘序列号.本地IP地址.外网IP地址OCX控件 开发语言:vc++ 可应用与WEB程序开发应用 <HTML><HEAD><TITLE> ...
- python编写的自动获取代理IP列表的爬虫-chinaboywg-ChinaUnix博客
python编写的自动获取代理IP列表的爬虫-chinaboywg-ChinaUnix博客 undefined Python多线程抓取代理服务器 | Linux运维笔记 undefined java如 ...
- Java根据ip地址获取Mac地址,Java获取Mac地址
Java根据ip地址获取Mac地址,Java获取Mac地址 >>>>>>>>>>>>>>>>>&g ...
- android获取Mac地址和IP地址
获取Mac地址实际项目中测试了如下几种方法:(1)设备开通Wifi连接,获取到网卡的MAC地址(但是不开通wifi,这种方法获取不到Mac地址,这种方法也是网络上使用的最多的方法) //根据Wifi信 ...
随机推荐
- URPF技术白皮书
URPF技术白皮书 摘 要:本文介绍了URPF的应用背景,URPF主要用于防止基于源地址欺骗的网络攻击行为,例如基于源地址欺骗的DoS攻击和DDoS攻击:随后介绍了URPF的技术原理以及URPF ...
- 【log4js】
手动创建日志目录 定时清理 nodejs之日志管理 玩转Nodejs日志管理log4js access.log-2015-11-20
- Unity3D之多个fbx导入场景, 合并多个动画
1:先导入到合适的文件夹, Unity自动刷新, 生成相应的文件. 2:在Project视图中选中单个fbx, 在Inspector中选择"Rig", 更改"Animat ...
- Android——监听开机启动,自启动应用程序
1.首先继承一个broadcastreceiver public class ConnectBroadCastReceiver extends BroadcastReceiver { @Overrid ...
- 关于 Unity NavMesh 数据的访问
目前的工作需要加入自动寻路,后来决定使用 unity 自带的 NavMesh,但有个问题是这个寻路数据,服务器也是需要的,那么我就要把这个数据导出为服务器所用才行. 但 NaveMesh 暂 ...
- SRM 609(1-250pt, 1-500pt)
嗯....还是应该坚持写题解的好习惯啊... DIV1 250pt 这难度是回到srm 300+的250了嘛...略 // BEGIN CUT HERE /* * Author: plum rain ...
- .net 码农转战 iOS - 初探
好久没写博客了,之前还打算把毕业设计中涉及到的两个算法拿出来说说(脸型分析 + 声音分析),博文都写了一半了,后来实在太忙了,那篇随笔也就沉在草稿列表中没动过. 我原先是专职 .net 开发的,在公司 ...
- 【转】linux下安装opencv
Installation in Linux These steps have been tested for Ubuntu 10.04 but should work with other distr ...
- 解决Ubuntu Server 12.04换了网卡MAC地址后 网络不可用的问题.
重装了系统,新建了一个ubuntu虚拟机,加载原来的镜像,结果启动后网络变得不正常了,提示信息 Waiting for network configuration...Waiting up to 60 ...
- 前端学习-使用JS库Leaflet.js生成世界地图并获取标注地址经纬度。
介绍:Leaflet是一个开源的JavaScript库,对移动端友好且对地图有很好的交互性. 大小仅仅只有 33 KB, 同时具有大多数地图所需要的特点. Leaflet设计的非常简单易懂, 同时具有 ...