- 1、本文档共6页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
Delphi下获取进程连接端口[转]
Windows操作系统提供了一个iphlpapi.dll文件,全称IP帮助API,通过这个函数库可以获取和修改电脑的网络配置、获取网络状态信息、管理网络活动,利用这个文件中两个未公开的函数AllocateAndGetTcpExTableFromStack和AllocateAndGetUdpExTableFromStack可以获得一个TCP连接表和一个UDP连接表,这两个连接表中包含了正在使用当前连接的进程ID号。
有的资料称只有WindowsXP及以上操作系统才提供了这些扩展IP帮助函数,但是在我的系统(Windows2000+SP4)中程序可以正常运行,我系统中的iphlpapi.dll文件版本号为5.0.2195.7097,程序使用Delphi7.0编写,对于不同的系统这个程序不知是否可以正常运行。
网上查到的很多例子都是VC++的,在VC++中调用这两个函数需要动态的从DLL文件中载入,因为对应的iphlpapi.lib文件中没有对这两个函数进行声明,但是在Delphi下没必要这么复杂,Delphi下调用DLL文件中的函数不需要对应的LIB文件,只要对函数进行声明再进行调用就可以了。这两个函数的声明如下:
//获取TCP连接表的IP帮助函数声明
functionAllocateAndGetTcpExTableFromStack(varpTcpTable;
bOrder:Bool;heap:THandle;zero:DWORD;flags:DWORD
):DWORD;stdcall;externaliphlpapi.dllnameAllocateAndGetTcpExTableFromStack;
//获取UDP连接表的IP帮助函数声明
functionAllocateAndGetUdpExTableFromStack(varpUdpTable;
bOrder:Bool;heap:THandle;zero:DWORD;flags:DWORD
):DWORD;stdcall;externaliphlpapi.dllnameAllocateAndGetUdpExTableFromStack;
在调用函数前还要自己定义几个结构,及TCP连接表和UDP连接表,代码如下:
//相关数据结构的定义const
ANY_SIZE=256;
type
MIB_TCPEXROW=record
dwState:DWORD; //连接状态dwLocalAddr:DWORD; //本地地址dwLocalPort:DWORD; //本地端口dwRemoteAddr:DWORD;//远程地址dwRemotePort:DWORD;//远程端口dwProcessId:DWORD; //进程ID号
end;
MIB_TCPEXTABLE=record
dwNumEntries:DWORD;//端口数量
table:array[0..ANY_SIZE-1]ofMIB_TCPEXROW;
end;
PMIB_TCPEXTABLE=^MIB_TCPEXTABLE;
MIB_UDPEXROW=record
dwLocalAddr:
DWORD;
//本地地址
dwLocalPort:
DWORD;
//本地端口
dwProcessId:
DWORD;
//进程ID号
end;
MIB_UDPEXTABLE=record
dwNumEntries:DWORD;//端口数量
table:array[0..ANY_SIZE-1]ofMIB_UDPEXROW;
end;
PMIB_UDPEXTABLE=^MIB_UDPEXTABLE;
这两个函数的调用代码如下:
AllocateAndGetTcpExTableFromStack(pTcpTab,true,GetProcessHeap(),2,2);
//获取TCP连接表AllocateAndGetUdpExTableFromStack(pUdpTab,true,GetProcessHeap(),2,2);
//获取UDP连接表
仅有进程ID号是不够的,还要获得进程对应可执行文件名,这个可以使用CreateToolhelp32Snapshot函数获得系统进程快照,利用Process32First函数和Process32Next函数从中查找出对应的进程,在Delphi中调用这几个函数要引用
文档评论(0)