在vb中使用Iphlpapi.dll获取网络信息 第二章 第四节 获取当前TCP连接情况

※==================================================================
※本连载文章说明:
※1、连载首发于《软件报》(http://www.sweek.com)2006年21期(2006年5月22日);
※2、此次网上连载采用的是原稿件结构,内容与《软件报》发表略有不同;
※3、谢绝除《软件报》及其相关刊物之外的传统媒体部分或全部转载;
※4、谢绝任何收费媒体、网络转载;
※5、原作者:uruseibest ,blog:http://blog.csdn.net/uruseibest
※6、如有其它疑问,请联系作者;
※7、如有转载,必须连同本说明一并发表,否则将追究转载者责任。
※======================================================================

第四节 获取当前TCP连接情况

1、函数:

Private Declare Function GetTcpTable Lib "iphlpapi.dll" (ByRef pTcpTable As MIB_TCPTABLE, ByRef pdwSize As Long, ByVal bOrder As Long) As Long

参数说明:

pTcpTable[输入]指向包含了MIB_TCPTABLE类型的TCP 连接表。

pdwSize[输入,输出]指向pTcpTable参数的缓冲区大小,如果分配的缓冲不够,那么就等于最小需要缓冲。

bOrder[输入]指定连接表是否按照类型排列。TRUE,那么就按以下类型顺序排列:Local IP addressLocal portRemote IP addressRemote port

返回值:成功,返回0;失败,返回错误代码。

 

2、使用到的类型:

MIB_TCPTABLE 类型包含Tcp连接表。

Type MIB_TCPTABLE

dwNum_Of_Entries As Long               当前包含MIB_TCPROW类型的总数

TCP_Table() As MIB_TCPROW        指向包含MIB_TCPROW类型的指针

End Type

备注:实际使用中可以定义:TCP_Table(120) As MIB_TCPROW       ' 预留足够缓存

 

MIB_TCPROW 类型包含了TCP连接信息。

Type MIB_TCPROW

dwState As Long                 ' TCP连接状态,为以下值之一:

常量名称

说明

MIB_TCP_STATE_CLOSED

1

关闭

MIB_TCP_STATE_LISTEN

2

正在监听

MIB_TCP_STATE_SYN_SENT

3

同步发送

MIB_TCP_STATE_SYN_RCVD

4

同步接收

MIB_TCP_STATE_ESTAB

5

已建立

MIB_TCP_STATE_FIN_WAIT1

6

FINWAIT 1

MIB_TCP_STATE_FIN_WAIT2

7

FINWAIT 2

MIB_TCP_STATE_CLOSE_WAIT

8

关闭等待

MIB_TCP_STATE_CLOSING

9

正在关闭

MIB_TCP_STATE_LAST_ACK

10

最后一次确认

MIB_TCP_STATE_TIME_WAIT

11

时间等待

MIB_TCP_STATE_DELETE_TCB

12

删除连接

 

dwLocalAddr As Long         '本地IP

dwLocalPort As Long          '本地端口

dwRemoteAddr As Long      '远程机器IP

dwRemotePort As Long       '远程机器端口

End Type

 

3、使用到的常量:

 

4、主要代码分析:

定义一个MIB_TCPTABLE类型的变量,因为我们在定义MIB_TCPTABLE类型的时候预留了足够的缓存( TCP_Table(120) As MIB_TCPROW ),因此获得定义变量的大小后直接调用GetTcpTable,但是要注意的是,实际获得的TCP连接的总数应为dwNum_Of_Entries的值,一般小于我们的定义(120):

Dim mtcp As MIB_TCPTABLE

mtcplen = Len(mtcp)

rvalue = GetTcpTable(mtcp, mtcplen, True)

使用For…Next循环遍历各个Tcp连接的信息:

For i = 0 To mtcp.dwNum_Of_Entries - 1

Print  mtcp.TCP_Table(i).dwLocalAddr & "->" & mtcp.TCP_Table(i).dwRemoteAddr

Next

因为MIB_TCPROW 类型中dwLocalAddrdwRemoteAddr均为一长整型数,因此要通过转换来获得IP地址:

Dim Ip_Buf(1 To 4) As Byte

CopyMemory Ip_Buf(1), dwLocalAddr, 4

GetIp = CStr(Ip_Buf(1)) + "." + CStr(Ip_Buf(2)) + "." + CStr(Ip_Buf(3)) + "." + CStr(Ip_Buf(4))

 

因为MIB_TCPROW 类型中dwLocalPortdwRemotePort均为一长整型数,因此要通过转换来获得端口:

GetPort = dwLocalPort/ 256 + (dwLocalPort Mod 256) * 256

 

5、运行时截图:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值