9
A
回答
11
可以使用GetExtendedTcpTable
函数传递TCP_TABLE_OWNER_PID_ALL
TableClass值,这将返回一个MIB_TCPTABLE_OWNER_PID
结构,其是一个阵列到MIB_TCPROW_OWNER_PID
记录,此结构包含的端口号(dwLocalPort)和过程的PID(dwOwningPid),您可以使用CreateToolhelp32Snapshot
函数来解析PID的名称。
样品
{$APPTYPE CONSOLE}
uses
WinSock,
TlHelp32,
Classes,
Windows,
SysUtils;
const
ANY_SIZE = 1;
iphlpapi = 'iphlpapi.dll';
TCP_TABLE_OWNER_PID_ALL = 5;
type
TCP_TABLE_CLASS = Integer;
PMibTcpRowOwnerPid = ^TMibTcpRowOwnerPid;
TMibTcpRowOwnerPid = packed record
dwState : DWORD;
dwLocalAddr : DWORD;
dwLocalPort : DWORD;
dwRemoteAddr: DWORD;
dwRemotePort: DWORD;
dwOwningPid : DWORD;
end;
PMIB_TCPTABLE_OWNER_PID = ^MIB_TCPTABLE_OWNER_PID;
MIB_TCPTABLE_OWNER_PID = packed record
dwNumEntries: DWORD;
table: Array [0..ANY_SIZE - 1] of TMibTcpRowOwnerPid;
end;
var
GetExtendedTcpTable:function (pTcpTable: Pointer; dwSize: PDWORD; bOrder: BOOL; lAf: ULONG; TableClass: TCP_TABLE_CLASS; Reserved: ULONG): DWord; stdcall;
function GetPIDName(hSnapShot: THandle; PID: DWORD): string;
var
ProcInfo: TProcessEntry32;
begin
ProcInfo.dwSize := SizeOf(ProcInfo);
if not Process32First(hSnapShot, ProcInfo) then
Result := 'Unknow'
else
repeat
if ProcInfo.th32ProcessID = PID then
Result := ProcInfo.szExeFile;
until not Process32Next(hSnapShot, ProcInfo);
end;
procedure ShowTCPPortsUsed(const AppName : string);
var
Error : DWORD;
TableSize : DWORD;
i : integer;
pTcpTable : PMIB_TCPTABLE_OWNER_PID;
SnapShot : THandle;
LAppName : string;
LPorts : TStrings;
begin
LPorts:=TStringList.Create;
try
TableSize := 0;
//Get the size o the tcp table
Error := GetExtendedTcpTable(nil, @TableSize, False, AF_INET, TCP_TABLE_OWNER_PID_ALL, 0);
if Error <> ERROR_INSUFFICIENT_BUFFER then exit;
GetMem(pTcpTable, TableSize);
try
SnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
try
//get the tcp table data
if GetExtendedTcpTable(pTcpTable, @TableSize, TRUE, AF_INET, TCP_TABLE_OWNER_PID_ALL, 0) = NO_ERROR then
for i := 0 to pTcpTable.dwNumEntries - 1 do
begin
LAppName:=GetPIDName(SnapShot, pTcpTable.Table[i].dwOwningPid);
if SameText(LAppName, AppName) and (LPorts.IndexOf(IntToStr(pTcpTable.Table[i].dwLocalPort))=-1) then
LPorts.Add(IntToStr(pTcpTable.Table[i].dwLocalPort));
end;
finally
CloseHandle(SnapShot);
end;
finally
FreeMem(pTcpTable);
end;
Writeln(LPorts.Text);
finally
LPorts.Free;
end;
end;
var
hModule : THandle;
begin
try
hModule := LoadLibrary(iphlpapi);
try
GetExtendedTcpTable := GetProcAddress(hModule, 'GetExtendedTcpTable');
ShowTCPPortsUsed('Skype.exe');
finally
FreeLibrary(hModule);
end;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
Readln;
end.
0
为了让你有正确的端口号来使用还有ntohs()
if SameText(LAppName, AppName) and
(LPorts.IndexOf(IntToStr(pTcpTable.Table[i].dwLocalPort))=-1) then
LPorts.Add(IntToStr(ntohs(pTcpTable.Table[i].dwLocalPort)));
更多信息here
相关问题
- 1. 如何确定哪个进程正在使用串行端口?
- 2. 如何找出正在使用哪个进程的文件
- 3. 使用c或Perl编程以找出正在使用哪个USB端口?
- 4. DirectoryEntry使用哪个端口?
- 5. XMPP使用哪个端口?
- 6. ZeroMQ:如何找到PAIR套接字使用哪个端口?
- 7. 如何查找当前使用哪个串行端口?
- 8. 如何找出哪些文件正被另一个进程
- 9. 如何找出哪个SATA端口磁盘连接到Windows 7
- 10. 检查哪个进程正在使用给定的端口
- 11. 如何查找哪个应用程序正在使用我的端口?
- 12. 如何使一个端口
- 13. 如何使一个子进程使用另一个终端输入和输出?
- 14. 无法找出哪个USB端口是前面的那个端口
- 15. 找出哪些端口的进程监听通过PHP
- 16. 如何在Windows中查找哪个程序正在使用端口80?
- 17. netty4:如何在多个端口上监听一个java进程
- 18. 如何设置哪一个将使用localhost端口
- 19. 如何查找哪个进程显示随机出现的窗口?
- 20. 同一端口上的2个进程?
- 21. 使用一个演员进出流端口
- 22. 如何找出一个程序在哪里寻找库
- 23. 哪个端口用于MongoDB?
- 24. 如何确定哪个进程正在打开某个TCP端口?
- 25. 如何找出哪个进程/服务启动网络连接
- 26. 如何使用TCP端口查找进程?
- 27. 如何找到正在使用端口的java进程
- 28. 如何找出哪个进程正在使用Java中的文件?
- 29. 有没有办法找出哪个蓝牙设备插入哪个USB端口?
- 30. RX100M3使用Liveview的哪个端口?
有一个片段或例子吗?没有用过, – Hidden
好的,添加了示例代码。 – RRUZ
好的,谢谢,我很快就会进行测试。 – Hidden