博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
vc枚举本机端口信息
阅读量:6114 次
发布时间:2019-06-21

本文共 2956 字,大约阅读时间需要 9 分钟。

关于查看本机端口信息,可能大多数人都知道在cmd下的netstat 命令,殊不知该命令在底层也是调用相关api来实现的,

相关函数有:
GetTcpTable
GetExtendedTcpTable
GetUdpTable
GetExtendedUdpTable
这些函数就可以获取相关tcp、udp端口以及相关进程的信息。而且这些函数都是从Iphlpapi.dll里导出的。
函数的相关用法可查询msdn在掌握,下面封装一段代码,来枚举每机的所有监听端口

 

#include "stdafx.h"#include 
#include
#include
#include
#include
#include
#pragma comment(lib, "iphlpapi.lib")#pragma comment(lib, "ws2_32.lib")using namespace std;#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))#define FREE(x) HeapFree(GetProcessHeap(), 0, (x))BOOL GetLocalListeningPort(list
& listPort);int _tmain(int argc, _TCHAR* argv[]){ list
portArray; GetLocalListeningPort(portArray); for (list
::iterator it = portArray.begin(); it != portArray.end(); it++) { WORD port = *it; printf("listenPort:%d\n", port); } return 0;}BOOL GetLocalListeningPort(list
& listPort){ PMIB_TCPTABLE pTcpTable; DWORD dwSize = 0; DWORD dwRetVal = 0; BOOL bRet = FALSE; char szLocalAddr[128]; char szBuf[128] = { 0 }; pTcpTable = (PMIB_TCPTABLE)szBuf; dwSize = 128 * sizeof(char); struct in_addr IpAddr; int i; if ((dwRetVal = GetTcpTable(pTcpTable, &dwSize, TRUE)) == ERROR_INSUFFICIENT_BUFFER) { pTcpTable = (MIB_TCPTABLE *)MALLOC(dwSize); if (pTcpTable == NULL) { printf("Error allocating memory\n"); return bRet; } } if ((dwRetVal = GetTcpTable(pTcpTable, &dwSize, TRUE)) == NO_ERROR) { printf("Number of entries: %d\n", pTcpTable->dwNumEntries); for (i = 0; i < (int)pTcpTable->dwNumEntries; i++) { IpAddr.S_un.S_addr = (u_long)pTcpTable->table[i].dwLocalAddr; strcpy_s(szLocalAddr, sizeof (szLocalAddr), inet_ntoa(IpAddr)); printf("local info: %s:%d \t", szLocalAddr, ntohs((u_short)pTcpTable->table[i].dwLocalPort)); printf(" TCP[%d] State: %ld - ", i, pTcpTable->table[i].dwState); switch (pTcpTable->table[i].dwState) { case MIB_TCP_STATE_CLOSED: printf("CLOSED \n"); break; case MIB_TCP_STATE_LISTEN: listPort.push_back(ntohs((u_short)pTcpTable->table[i].dwLocalPort)); printf("LISTEN \n"); break; case MIB_TCP_STATE_SYN_SENT: printf("SYN-SENT \n"); break; case MIB_TCP_STATE_SYN_RCVD: printf("SYN-RECEIVED \n"); break; case MIB_TCP_STATE_ESTAB: printf("ESTABLISHED \n"); break; case MIB_TCP_STATE_FIN_WAIT1: printf("FIN-WAIT-1 \n"); break; case MIB_TCP_STATE_FIN_WAIT2: printf("FIN-WAIT-2 \n"); break; case MIB_TCP_STATE_CLOSE_WAIT: printf("CLOSE-WAIT \n"); break; case MIB_TCP_STATE_CLOSING: printf("CLOSING \n"); break; case MIB_TCP_STATE_LAST_ACK: printf("LAST-ACK \n"); break; case MIB_TCP_STATE_TIME_WAIT: printf("TIME-WAIT \n"); break; case MIB_TCP_STATE_DELETE_TCB: printf("DELETE-TCB \n"); break; default: printf("UNKNOWN dwState value \n"); break; } } } else { printf("GetTcpTable failed with %d \n", dwRetVal); goto EXIT; } bRet = TRUE;EXIT: if (pTcpTable != (PMIB_TCPTABLE)szBuf) { FREE(pTcpTable); pTcpTable = NULL; } return bRet;}

 

 相关链接:

 

转载于:https://www.cnblogs.com/priarieNew/p/9761136.html

你可能感兴趣的文章
centos64i386下apache 403没有权限访问。
查看>>
vb sendmessage 详解1
查看>>
jquery用法大全
查看>>
Groonga 3.0.8 发布,全文搜索引擎
查看>>
PC-BSD 9.2 发布,基于 FreeBSD 9.2
查看>>
网卡驱动程序之框架(一)
查看>>
css斜线
查看>>
Windows phone 8 学习笔记(3) 通信
查看>>
重新想象 Windows 8 Store Apps (18) - 绘图: Shape, Path, Stroke, Brush
查看>>
Revit API找到风管穿过的墙(当前文档和链接文档)
查看>>
Scroll Depth – 衡量页面滚动的 Google 分析插件
查看>>
Windows 8.1 应用再出发 - 视图状态的更新
查看>>
自己制作交叉编译工具链
查看>>
Qt Style Sheet实践(四):行文本编辑框QLineEdit及自动补全
查看>>
[物理学与PDEs]第3章习题1 只有一个非零分量的磁场
查看>>
深入浅出NodeJS——数据通信,NET模块运行机制
查看>>
onInterceptTouchEvent和onTouchEvent调用时序
查看>>
android防止内存溢出浅析
查看>>
4.3.3版本之引擎bug
查看>>
SQL Server表分区详解
查看>>