usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Web;usingSystem.Runtime.InteropServices;namespaceeXtremeSQLwcfws
{public classIsConnected
{//检查远程主机与本机是否存在连接//远程主机的IP///远程主机的PORT///
public static int CheckConnected(string host, stringport)
{try{
MIB_TCPTABLE tcpTableData= newMIB_TCPTABLE();
tcpTableData=GetTcpTableInfo();for (int i = 0; i
{string i_p = GetIpAddress(tcpTableData.table[i].dwRemoteAddr) + ":" +GetTcpPort(tcpTableData.table[i].dwRemotePort).ToString();if (i_p == host + ":" + port) returntcpTableData.table[i].dwState;
}
}catch(Exception)
{ }return 0;
}
[StructLayout(LayoutKind.Sequential)]public classMIB_TCPROW
{public intdwState;public intdwLocalAddr;public intdwLocalPort;public intdwRemoteAddr;public intdwRemotePort;
}
[StructLayout(LayoutKind.Sequential)]public classMIB_TCPTABLE
{public intdwNumEntries;publicMIB_TCPROW[] table;
}protected static string GetIpAddress(longipAddrs)
{try{
System.Net.IPAddress ipAddress= newSystem.Net.IPAddress(ipAddrs);returnipAddress.ToString();
}catch{returnipAddrs.ToString(); }
}
[DllImport("Ws2_32.dll")]static extern ushort ntohs(ushortnetshort);protected static ushort GetTcpPort(inttcpPort)
{return ntohs((ushort)tcpPort);
}
[DllImport("Iphlpapi.dll")]static extern int GetTcpTable(IntPtr pTcpTable, ref int pdwSize, boolbOrder);protected staticMIB_TCPTABLE GetTcpTableInfo()
{//声明一个指针准备接受Tcp连接信息
IntPtr hTcpTableData =IntPtr.Zero;//声明hTcpTableData指针所指向的内存缓冲区大小
int iBufferSize = 0;//声明MIB_TCPTABLE对象,作为返回值
MIB_TCPTABLE tcpTable = newMIB_TCPTABLE();//声明一个List对象来临时存放MIB_TCPROW对象
List lstTcpRows = new List();//调用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
{//hTcpTableData是指向MIB_TCPTABLE缓冲区的内存起始区域,由于其成员数据在内存中是顺序排列//所以我们可以推断hTcpTableData+4(也就是sizeof(dwNumEntries)的长度)后就是MIB_TCPROW数组的第一个元素
IntPtr hTempTableRow = new IntPtr(hTcpTableData.ToInt32() + 4 + i *iTcpRowLen);
MIB_TCPROW tcpRow= newMIB_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= newMIB_TCPROW[lstTcpRows.Count];
lstTcpRows.CopyTo(tcpTable.table);returntcpTable;
}
}
}