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.
随机推荐
- Jenkins部署web项目到Tomcat(shell脚本)
一.首先配置Publish Over SSH插件 配置地址:系统管理-->系统设置-->Publish over SSH(需要安装Publish over SSH插件) 二.jenkins ...
- 这几个小技巧,让你书写不一样的Vue!
前言 最近一直在阅读Vue的源码,发现了几个实战中用得上的小技巧,下面跟大家分享一下. 同时也可以阅读我之前写的Vue文章 vue开发中的"骚操作" 挖掘隐藏在源码中的Vue技巧! ...
- mysql本地中127.0.0.1连接不上数据库怎么办
首先在本地使用Navicat for MySQL建立一个bai数据库.在dreamweaver中建立一个PHP格式的网页,方便链接测试.测试发du现,如果zhi无法使用localhost链接mysql ...
- CF976B
这是一道考验思维找规律的题,很有可做性. 正文 题意 一个 n * m 的矩阵,从左上角(1 , 1) 开始,先向下走直到最下方,再向右走到最右,再向上走一个,再走到最左......一直走到(1 , ...
- 从零搭建一个IdentityServer——初识OpenIDConnect
上一篇文章实现了IdentityServer4与Asp.net core Identity的集成,可以使用通过identity注册功能添加的用户,以Password的方式获取Access token, ...
- hibernate+spring+tomcat启动报错Not supported by BasicDataSource
最近使用hibernate+spring+jsp的小项目制作过程中出现一些错误,例如: java.lang.UnsupportedOperationException: Not supported b ...
- 彻底搞懂Cookie、Session、Token到底是什么
洛:大爷,楼上322住的是马冬梅家吧? 大爷:马都什么? 夏洛:马冬梅. 大爷:什么都没啊? 夏洛:马冬梅啊. 大爷:马什么没? 夏洛:行,大爷你先凉快着吧. 在了解这三个概念之前我们先要了解HTTP ...
- 操作系统中的描述符和GDT
在操作系统中,全局描述符是什么?GDT又是什么?在进入保护模式之前,准备好GDT和GDT中的描述符是必须的吗?用汇编代码怎么创建描述符?本文解答上面几个问题. 在实模式下,CPU是16位的,意思是,寄 ...
- 一文弄懂-BIO,NIO,AIO
目录 一文弄懂-BIO,NIO,AIO 1. BIO: 同步阻塞IO模型 2. NIO: 同步非阻塞IO模型(多路复用) 3.Epoll函数详解 4.Redis线程模型 5. AIO: 异步非阻塞IO ...
- hdu4710 Balls Rearrangement(数学公式+取模)
Balls Rearrangement Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...