获取在C#中给定端口侦听的PID的最简单方法是什么? 基本上,我想确保我的服务正在运行,并在我提供的端口上进行侦听。 如果有比解析netstat输出更简单的方法,它将会很棒。哪个PID在给定的端口上侦听c#
4
A
回答
6
从Win XP SP2的起你可以P/Invoke到GetExtendedTcpTable
使用This person's样的工作来充实签名(该PInvoke.net规范是不完整的)这里a(粗略且差错检查)示例
using System;
using System.Runtime.InteropServices;
public enum TCP_TABLE_CLASS : int
{
TCP_TABLE_BASIC_LISTENER,
TCP_TABLE_BASIC_CONNECTIONS,
TCP_TABLE_BASIC_ALL,
TCP_TABLE_OWNER_PID_LISTENER,
TCP_TABLE_OWNER_PID_CONNECTIONS,
TCP_TABLE_OWNER_PID_ALL,
TCP_TABLE_OWNER_MODULE_LISTENER,
TCP_TABLE_OWNER_MODULE_CONNECTIONS,
TCP_TABLE_OWNER_MODULE_ALL
}
[StructLayout(LayoutKind.Sequential)]
public struct MIB_TCPROW_OWNER_PID
{
public uint state;
public uint localAddr;
public byte localPort1;
public byte localPort2;
public byte localPort3;
public byte localPort4;
public uint remoteAddr;
public byte remotePort1;
public byte remotePort2;
public byte remotePort3;
public byte remotePort4;
public int owningPid;
public ushort LocalPort
{
get
{
return BitConverter.ToUInt16(
new byte[2] { localPort2, localPort1}, 0);
}
}
public ushort RemotePort
{
get
{
return BitConverter.ToUInt16(
new byte[2] { remotePort2, remotePort1}, 0);
}
}
}
[StructLayout(LayoutKind.Sequential)]
public struct MIB_TCPTABLE_OWNER_PID
{
public uint dwNumEntries;
MIB_TCPROW_OWNER_PID table;
}
[DllImport("iphlpapi.dll", SetLastError=true)]
static extern uint GetExtendedTcpTable(IntPtr pTcpTable,
ref int dwOutBufLen,
bool sort,
int ipVersion,
TCP_TABLE_CLASS tblClass,
int reserved);
public static MIB_TCPROW_OWNER_PID[] GetAllTcpConnections()
{
MIB_TCPROW_OWNER_PID[] tTable;
int AF_INET = 2; // IP_v4
int buffSize = 0;
// how much memory do we need?
uint ret = GetExtendedTcpTable(IntPtr.Zero,
ref buffSize,
true,
AF_INET,
TCP_TABLE_CLASS.TCP_TABLE_OWNER_PID_ALL,
0);
if (ret != 0 && ret != 122) // 122 insufficient buffer size
throw new Exception("bad ret on check " + ret);
IntPtr buffTable = Marshal.AllocHGlobal(buffSize);
try
{
ret = GetExtendedTcpTable(buffTable,
ref buffSize,
true,
AF_INET,
TCP_TABLE_CLASS.TCP_TABLE_OWNER_PID_ALL,
0);
if (ret != 0)
throw new Exception("bad ret "+ ret);
// get the number of entries in the table
MIB_TCPTABLE_OWNER_PID tab =
(MIB_TCPTABLE_OWNER_PID)Marshal.PtrToStructure(
buffTable,
typeof(MIB_TCPTABLE_OWNER_PID));
IntPtr rowPtr = (IntPtr)((long)buffTable +
Marshal.SizeOf(tab.dwNumEntries));
tTable = new MIB_TCPROW_OWNER_PID[tab.dwNumEntries];
for (int i = 0; i < tab.dwNumEntries; i++)
{
MIB_TCPROW_OWNER_PID tcpRow = (MIB_TCPROW_OWNER_PID)Marshal
.PtrToStructure(rowPtr, typeof(MIB_TCPROW_OWNER_PID));
tTable[i] = tcpRow;
// next entry
rowPtr = (IntPtr)((long)rowPtr + Marshal.SizeOf(tcpRow));
}
}
finally
{
// Free the Memory
Marshal.FreeHGlobal(buffTable);
}
return tTable;
}
3
退房这个项目:
它使用的Interop在C#中去的根本GetTcpTable赢API函数。因此可以给你你正在寻找的进程ID。
希望帮助, 亚历
相关问题
- 1. 确定在某个端口上侦听的进程pid
- 2. 哪个PID监听给定的马赫数端口
- 3. netstate -lput不显示在端口8080上侦听的deamon的pid?
- 4. 侦听给定端口的程序
- 5. c上的网络端口侦听器#
- 6. 确定服务器是否在给定端口上侦听
- 7. Socket.io在多个端口上侦听?
- 8. C#侦听TCP端口
- 9. C /如何侦听多个UDP端口
- 10. 服务器侦听多个端口c
- 11. 侦听多个TCP端口
- 12. Ignite服务器侦听哪些端口
- 13. SQL Azure在替代端口上侦听
- 14. 哪个win32 API可以用来侦听窗口中的端口?
- 15. 如何识别Python的SocketServer中正在侦听哪个端口?
- 16. 找不到在Mac OS X上的端口8001上侦听哪个进程
- 17. 我的tcp侦听器侦听哪个网络接口
- 18. 端口80上的Mac侦听器
- 19. 默认情况下,socketIO客户端侦听哪个端口?
- 20. 的Java侦听端口
- 21. NIO。多个客户端通道在同一端口上侦听
- 22. C++在窗口中的某个端口上侦听什么进程
- 23. TcpListener:如何侦听所有接口上的特定端口?
- 24. 在python中是否有跨平台的方式来确定哪个进程正在侦听给定的端口?
- 25. Node.js应用程序未在指定的端口上侦听
- 26. emailrelay“无法绑定侦听端口”
- 27. tomcat websocket servlet侦听端口
- 28. 调查哪个Windows服务正在侦听哪个IP和端口
- 29. 几个线程在一个UDP端口上侦听?
- 30. 一个Windows服务可能在多个端口上侦听吗?