当前位置: 首页 > news >正文

vc枚举本机端口信息

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

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

 

#include "stdafx.h"
#include <winsock2.h>
#include <ws2tcpip.h>
#include <iphlpapi.h>
#include <stdio.h>
#include <Windows.h>
#include <list>

#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<WORD> & listPort);

int _tmain(int argc, _TCHAR* argv[])
{
	list<WORD> portArray;

	GetLocalListeningPort(portArray);

	for (list<WORD>::iterator it = portArray.begin(); it != portArray.end(); it++)
	{
		WORD port = *it;
		printf("listenPort:%d\n", port);
	}
	return 0;
}

BOOL GetLocalListeningPort(list<WORD> & 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://msdn.microsoft.com/en-us/library/windows/desktop/aa365930(v=vs.85).aspx
https://msdn.microsoft.com/en-us/library/windows/desktop/aa365928(v=vs.85).aspx
https://msdn.microsoft.com/en-us/library/windows/desktop/aa366026(v=vs.85).aspx
IcmpSendEcho

 

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

相关文章:

  • 读ant design设计语言 记录
  • BZOJ[Usaco2017 Jan]Promotion Counting——线段树合并
  • Bokeh中数据的添加、修改和筛选 | Bokeh 小册子
  • 2018-2019-1 20165226 《信息安全系统设计基础》第3周学习总结
  • Spring boot初体验
  • Angular2入门教程-2 实现TodoList App
  • 3、桶排序
  • Oracle DB 优化-AWR及相关内容
  • 大话 JavaScript 动画
  • Pycharm的使用一
  • iOS__上传应用到AppStore出现Authenticating with the iTunes store
  • 数字联盟刘晶晶:四年只做一个产品
  • java 通过Unsafe不使用构造器直接创建对象
  • jenkins配置用户角色权限,根据不同权限显示视图、Job
  • JVM虚拟机(五):JDK8内存模型—消失的PermGen
  • 网络传输文件的问题
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • 2017届校招提前批面试回顾
  • Android 架构优化~MVP 架构改造
  • Debian下无root权限使用Python访问Oracle
  • Iterator 和 for...of 循环
  • javascript 总结(常用工具类的封装)
  • JavaScript服务器推送技术之 WebSocket
  • Java超时控制的实现
  • java中的hashCode
  • Less 日常用法
  • Linux CTF 逆向入门
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • RxJS: 简单入门
  • SpringBoot几种定时任务的实现方式
  • 给初学者:JavaScript 中数组操作注意点
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 用jQuery怎么做到前后端分离
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • #100天计划# 2013年9月29日
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (附源码)ssm码农论坛 毕业设计 231126
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (转)jQuery 基础
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .NET Core 中插件式开发实现
  • .net wcf memory gates checking failed
  • .NET 设计模式—适配器模式(Adapter Pattern)
  • .Net多线程总结
  • .Net环境下的缓存技术介绍
  • .NET牛人应该知道些什么(2):中级.NET开发人员
  • @Autowired @Resource @Qualifier的区别
  • [.NET 即时通信SignalR] 认识SignalR (一)
  • [BZOJ 4129]Haruna’s Breakfast(树上带修改莫队)
  • [C# WPF] 如何给控件添加边框(Border)?