在C#GetTcpTable2()
一個簡單的例子。
[DllImport("iphlpapi.dll", SetLastError = true)]
static extern int GetTcpTable2(byte[] pTcpTable, out int pdwSize, bool bOrder);
static void Main(string[] args) {
int pdwSize = 20000;
byte[] buffer = new byte[pdwSize];
int res = GetTcpTable2(buffer, out pdwSize, true);
if (res != 0) {
buffer = new byte[pdwSize];
res = GetTcpTable2(buffer, out pdwSize, true);
if (res != 0) throw new Exception(res);
}
int nOffset = 0;
var dwNumEntries = Convert.ToInt32(buffer[nOffset]); nOffset += 4;
Console.WriteLine("total connection: {0}", dwNumEntries);
for (int i = 0; i < dwNumEntries; i++) {
Console.WriteLine("*****************");
int st = Convert.ToInt32(buffer[nOffset]);
Console.WriteLine("state: {0}", st); nOffset += 4;
string LocalAdrr = buffer[nOffset].ToString() + "." + buffer[nOffset + 1].ToString() + "."
+ buffer[nOffset + 2].ToString() + "." + buffer[nOffset + 3].ToString();
Console.WriteLine("local ip: {0}", LocalAdrr); nOffset += 4;
int LocalPort = (((int)buffer[nOffset]) << 8) + (((int)buffer[nOffset + 1])) +
(((int)buffer[nOffset + 2]) << 24) + (((int)buffer[nOffset + 3]) << 16);
Console.WriteLine("local port: {0}", LocalPort); nOffset += 4;
string RemoteAdrr = buffer[nOffset].ToString() + "." + buffer[nOffset + 1].ToString() + "."
+ buffer[nOffset + 2].ToString() + "." + buffer[nOffset + 3].ToString();
Console.WriteLine("remote ip: {0}", RemoteAdrr); nOffset += 4;
int RemotePort = (RemoteAdrr == "0.0.0.0") ? 0
: RemotePort = (((int)buffer[nOffset]) << 8) + (((int)buffer[nOffset + 1])) +
(((int)buffer[nOffset + 2]) << 24) + (((int)buffer[nOffset + 3]) << 16);
Console.WriteLine("remote port: {0}", RemotePort); nOffset += 4;
int pid = BitConverter.ToInt32(buffer.Skip(nOffset).Take(4).ToArray(), 0);
Console.WriteLine("pid: {0}", pid); nOffset += 4;
int OffloadState = Convert.ToInt32(buffer[nOffset]);
Console.WriteLine("OffloadState: {0}", OffloadState); nOffset += 4;
}
}
偉大的!感謝您的解釋:) –
如何在Delphi中做到這一點? – 2013-09-18 15:18:10
@EricSantos實現相同的API,適用相同的原則。幸運的是,你不會像在.NET中那樣做一半的編組。 – Lloyd