c++ 使用进程id获取打开的网络端口
#pragma warning( disable : 4996)
#include <winsock2.h>
#include <ws2tcpip.h>
#include <iphlpapi.h>
#include <stdio.h>
#include <string>
#include <vector>
#pragma comment(lib, "iphlpapi.lib")
#pragma comment(lib, "ws2_32.lib")
#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))
#define FREE(x) HeapFree(GetProcessHeap(), 0, (x))
using namespace std;
string toIp(DWORD ip)
{
size_t a = ip >> 24 & 0xFF;
size_t b = ip >> 16 & 0xFF;
size_t c = ip >> 8 & 0xFF;
size_t d = ip & 0xFF;
// 数据是大端就用 abcd,小端dcba
return string(to_string(d) + "." + to_string(c) + "." + to_string(b) + "." + to_string(a));
}
struct ConnectNet
{
DWORD proto = 0; // 6 tcp,17 udp
string src; // src ip
u_short sport; // src port
string dst; // dst ip
u_short dport; // dst port
string state;
DWORD pid; // process id
};
BOOL eachTCP(DWORD pid, vector<ConnectNet>* connectNets)
{
PMIB_TCPTABLE2 pTcpTable = nullptr;
ULONG ulSize = 0;
DWORD dwRetVal = 0;
// 第一次获取大小,初始化pTcpTable
if ((dwRetVal = GetTcpTable2(pTcpTable, &ulSize, TRUE)) ==
ERROR_INSUFFICIENT_BUFFER) {
pTcpTable = (MIB_TCPTABLE2*)MALLOC(ulSize);
if (pTcpTable == NULL) return 0;
}
// 第二次获取数据
if ((dwRetVal = GetTcpTable2(pTcpTable, &ulSize, TRUE)) == NO_ERROR) {
if (pTcpTable == NULL) return 0;
for (size_t i = 0; i < pTcpTable->dwNumEntries; i++) {
auto it = pTcpTable->table[i];
if (pid != it.dwOwningPid && pid != 0) continue;
string state = "";
switch (it.dwState) {
case MIB_TCP_STATE_CLOSED:
state = "CLOSED";
break;
case MIB_TCP_STATE_LISTEN:
state = "LISTEN";
break;
case MIB_TCP_STATE_SYN_SENT:
state = ("SYN-SENT");
break;
case MIB_TCP_STATE_SYN_RCVD:
state = ("SYN-RECEIVED");
break;
case MIB_TCP_STATE_ESTAB:
state = ("ESTABLISHED");
break;
case MIB_TCP_STATE_FIN_WAIT1:
state = ("FIN-WAIT-1");
break;
case MIB_TCP_STATE_FIN_WAIT2:
state = ("FIN-WAIT-2");
break;
case MIB_TCP_STATE_CLOSE_WAIT:
state = ("CLOSE-WAIT");
break;
case MIB_TCP_STATE_CLOSING:
state = ("CLOSING");
break;
case MIB_TCP_STATE_LAST_ACK:
state = ("LAST-ACK");
break;
case MIB_TCP_STATE_TIME_WAIT:
state = ("TIME-WAIT");
break;
case MIB_TCP_STATE_DELETE_TCB:
state = ("DELETE-TCB");
break;
default:
state = ("UNKNOWN dwState value");
break;
}
connectNets->push_back(ConnectNet{
6,
toIp(it.dwLocalAddr), ntohs((u_short)it.dwLocalPort),
toIp(it.dwRemoteAddr), ntohs((u_short)it.dwRemotePort),
state,
it.dwOwningPid
});
}
}
else {
FREE(pTcpTable);
return FALSE;
}
if (pTcpTable != NULL) {
FREE(pTcpTable);
pTcpTable = NULL;
}
return TRUE;
}
BOOL eachUDP(DWORD pid, vector<ConnectNet>* connectNets)
{
MIB_UDPTABLE_OWNER_PID* pUdpTable = nullptr;
ULONG ulSize = 0;
DWORD dwRetVal = 0;
// 第一次获取大小,初始化pTcpTable
if ((dwRetVal = GetExtendedUdpTable(pUdpTable, &ulSize, TRUE, AF_INET, UDP_TABLE_CLASS::UDP_TABLE_OWNER_PID, 0)) ==
ERROR_INSUFFICIENT_BUFFER) {
pUdpTable = (MIB_UDPTABLE_OWNER_PID*)MALLOC(ulSize);
if (pUdpTable == NULL) return 0;
}
// 第二次获取数据
if ((dwRetVal = GetExtendedUdpTable(pUdpTable, &ulSize, TRUE, AF_INET, UDP_TABLE_CLASS::UDP_TABLE_OWNER_PID, 0)) == NO_ERROR) {
if (pUdpTable == NULL) return 0;
for (size_t i = 0; i < pUdpTable->dwNumEntries; i++) {
auto it = pUdpTable->table[i];
if (it.dwOwningPid != pid && pid != 0) continue;
connectNets->push_back(ConnectNet{
17,
toIp(it.dwLocalAddr).c_str(), ntohs((u_short)it.dwLocalPort),
"*", 0,
"",
it.dwOwningPid
});
}
}
else {
FREE(pUdpTable);
return FALSE;
}
if (pUdpTable != NULL) {
FREE(pUdpTable);
pUdpTable = NULL;
}
return TRUE;
}
BOOL getNetTable(DWORD pid, vector<ConnectNet>* connectNets)
{
if (!eachTCP(pid, connectNets)) return FALSE;
return eachUDP(pid, connectNets);
}
// https://docs.microsoft.com/en-us/windows/win32/api/iphlpapi/nf-iphlpapi-gettcptable2
// https://docs.microsoft.com/en-us/windows/win32/api/iphlpapi/nf-iphlpapi-getudptable
int main()
{
vector<ConnectNet> r;
if (getNetTable(0, &r))
{
for (auto it : r)
{
if (it.proto == 6)
{
printf("\t%s\t%s:%d\t%s:%d\t%s\t%d\n", "TCP", it.src.c_str(), it.sport, it.dst.c_str(), it.dport, it.state.c_str(), it.pid);
}
else if (it.proto == 17)
{
printf("\t%s\t%s:%d\t%s:%s\t\t%d\n", "UDP", it.src.c_str(), it.sport, it.dst.c_str(), it.dport, it.pid);
}
}
}
return 0;
}
c++ 使用进程id获取打开的网络端口的更多相关文章
- 利用进程ID获取主线程ID
利用进程ID获取主线程ID,仅适用于单线程.多线程应区分哪个是主线程,区分方法待验证 (1)好像可以用StartTime最早的,不过通过线程执行时间不一定可靠,要是在最开始就CreateThread了 ...
- 通过进程ID获取基地址
下面代码是通过进程ID来获取进程的基地址,创建一个进程快照后,读取进程模块,一般情况下第一个模块就是进程的基地址,下面的程序通过模块的字符串匹配来找到基地址.通过MODULEENTRY32来读取,下面 ...
- Delphi 通得进程ID获取主窗口句柄
只知道进程ID,获取主窗口句柄的方法如下: 通过EnumWindows枚举所有窗口 使用GetWindowThreadProcessID,通过窗口句柄获取进程ID 比便获取的进程ID与当前已知的进程I ...
- C++ Windows 下 根据进程名获取进程ID 以及该进程下所有窗口的句柄
#include <windows.h> #include <stdint.h> #include <tlhelp32.h> #include <stdio. ...
- 线程、线程ID获取
一.进程ID获取 1.1 当前进程的Id 方法1 通过进程名获取 下面的例子中,也包含了获取该进程下的线程的方法. System.Diagnostics.Process[] processes:bo ...
- 获取进程ID,父进程ID,进程完整路径
准备写一个进程管理的功能模块,今天下午先写了扫描获取本机各个进程路径,获取各个进程映像名称,进程完整路径. 要获取进程信息,第一步想到的就是提权,提权代码用过多次了,今天也小结了一下(http://w ...
- linux -- 进程的查看、进程id的获取、进程的杀死
进程查看 ps ax : 显示当前系统进程的列表 ps aux : 显示当前系统进程详细列表以及进程用户 ps ax|less : 如果输出过长,可能添加管道命令 less查看具体进程, 如:ps a ...
- C#获取运行程序的进程ID
C#获取运行程序的进程ID [DllImport("User32.dll", CharSet = CharSet.Auto)] public static extern int G ...
- 如何通过进程名获取进程ID
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:如何通过进程名获取进程ID.
随机推荐
- Redis击穿、穿透、雪崩产生原因以及解决思路
击穿 大家都知道,计算机的瓶颈之一就是IO,为了解决内存与磁盘速度不匹配的问题,产生了缓存,将一些热点数据放在内存中,随用随取,降低连接到数据库的请求链接,避免数据库挂掉.需要注意的是,无论是击穿还是 ...
- java创建线程的多种方式
java创建线程的四种方式 1.继承 Thread 类 通过继承 Thread 类,并重写它的 run 方法,我们就可以创建一个线程. 首先定义一个类来继承 Thread 类,重写 run 方法. 然 ...
- 高性能缓存 Caffeine 原理及实战
一.简介 Caffeine 是基于Java 8 开发的.提供了近乎最佳命中率的高性能本地缓存组件,Spring5 开始不再支持 Guava Cache,改为使用 Caffeine. 下面是 Caffe ...
- 深度学习论文翻译解析(十八):MobileNetV2: Inverted Residuals and Linear Bottlenecks
论文标题:MobileNetV2: Inverted Residuals and Linear Bottlenecks 论文作者:Mark Sandler Andrew Howard Menglong ...
- java获取post请求头部字符串
尝试过很多方式,下面的方式最有效: 用获取数据流的方式,直接获取post过来的所有数据流 // 读取请求内容 BufferedReader br = new BufferedReader(new In ...
- 前端基础之html学习一:
网站的建站流程 页面图例 网页的结构 WEB标准 WEB标准是网页制作的标准,它不是一个标准,它是根据网页的不同组成部分生成的一系列标准.这些标准大部分由W3C起草发布,也有部分标准由ECMA起草发布 ...
- Pytest(12)pytest缓存
前言 pytest 运行完用例之后会生成一个 .pytest_cache 的缓存文件夹,用于记录用例的ids和上一次失败的用例. 方便我们在运行用例的时候加上--lf 和 --ff 参数,快速运行上一 ...
- 在eclipse完成对Java_web项目里面资源文件的读取
Java_web项目的资源文件一般有两种: 一种是存放数据之间有联系的文件,使用xml文件 另一种是存放数据之间没有联系的文件,使用properties文件 这里我们对properties文件读写做示 ...
- 1、Django框架目录介绍
1.windows上安装django pip install django==1.10.3 安装完成后:django-admin.exe 默认存放路径:C:\Users\licl11092\AppDa ...
- Dubbo SPI 机制源码分析(基于2.7.7)
Dubbo SPI 机制涉及到 @SPI.@Adaptive.@Activate 三个注解,ExtensionLoader 作为 Dubbo SPI 机制的核心负责加载和管理扩展点及其实现.本文以 E ...