#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获取打开的网络端口的更多相关文章

  1. 利用进程ID获取主线程ID

    利用进程ID获取主线程ID,仅适用于单线程.多线程应区分哪个是主线程,区分方法待验证 (1)好像可以用StartTime最早的,不过通过线程执行时间不一定可靠,要是在最开始就CreateThread了 ...

  2. 通过进程ID获取基地址

    下面代码是通过进程ID来获取进程的基地址,创建一个进程快照后,读取进程模块,一般情况下第一个模块就是进程的基地址,下面的程序通过模块的字符串匹配来找到基地址.通过MODULEENTRY32来读取,下面 ...

  3. Delphi 通得进程ID获取主窗口句柄

    只知道进程ID,获取主窗口句柄的方法如下: 通过EnumWindows枚举所有窗口 使用GetWindowThreadProcessID,通过窗口句柄获取进程ID 比便获取的进程ID与当前已知的进程I ...

  4. C++ Windows 下 根据进程名获取进程ID 以及该进程下所有窗口的句柄

    #include <windows.h> #include <stdint.h> #include <tlhelp32.h> #include <stdio. ...

  5. 线程、线程ID获取

    一.进程ID获取 1.1  当前进程的Id 方法1 通过进程名获取 下面的例子中,也包含了获取该进程下的线程的方法. System.Diagnostics.Process[] processes:bo ...

  6. 获取进程ID,父进程ID,进程完整路径

    准备写一个进程管理的功能模块,今天下午先写了扫描获取本机各个进程路径,获取各个进程映像名称,进程完整路径. 要获取进程信息,第一步想到的就是提权,提权代码用过多次了,今天也小结了一下(http://w ...

  7. linux -- 进程的查看、进程id的获取、进程的杀死

    进程查看 ps ax : 显示当前系统进程的列表 ps aux : 显示当前系统进程详细列表以及进程用户 ps ax|less : 如果输出过长,可能添加管道命令 less查看具体进程, 如:ps a ...

  8. C#获取运行程序的进程ID

    C#获取运行程序的进程ID [DllImport("User32.dll", CharSet = CharSet.Auto)] public static extern int G ...

  9. 如何通过进程名获取进程ID

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:如何通过进程名获取进程ID.

随机推荐

  1. LOJ2632

    题目描述 译自 BalticOI 2011 Day1 T3「Switch the Lamp On」有一种正方形的电路元件,在它的两组相对顶点中,有一组会用导线连接起来,另一组则不会.有  个这样的元件 ...

  2. loj10173

    炮兵阵地 司令部的将军们打算在 N×M 的网格地图上部署他们的炮兵部队.一个 N×M的地图由 N 行 M 列组成,地图的每一格可能是山地(用 H 表示),也可能是平原(用 P表示),如下图.在每一格平 ...

  3. JSP标签使用的代码记录——《%= %》(神奇的CSDN为啥标题不让打英文的尖括号)

    关于JSP的一些标签,在用到的时候有些生疏,就去找了找资源重新温习了一下. 附上两个JSP<%= %>标签的博客,同时也记录当前项目里用到的方法. jsp页面中<%@ %>.& ...

  4. centos编译安装vim7.4

    ./configure --with-features=huge --enable-fontset --enable-gui=gtk2 --enable-multibyte --enable-pyth ...

  5. shell (颜色输出)

    摘自https://www.cnblogs.com/t-road/p/10257296.html #!/bin/bash # #下面是字体输出颜色及终端格式控制 #字体色范围:30-37 echo - ...

  6. mysql-mysqli_fetch_all(错误)

    mysql-mysqli_fetch_all(错误) 问题:使用mysql-mysqli_fetch_all获取返回的数组时失败/报错 原因及解决方法: mysqli_fetch_all函数只存在于m ...

  7. 人均年薪50万以上,docker到底是什么?为什么这么火?

    为什么要使用Docker? 场景一:公司双十一买了一堆服务器,技术总监让你给它们一个个都配置上JDK.Mysql.Redis等软件环境. 你心里小声嘀咕:"这总监不讲武德!"然后你 ...

  8. leetcode常见问题

    开学了 开始每日刷leetcode了  ,开一个新分类记录做题过程和心得. 1.出现本地调试无问题但提交后报错时,很有可能是全局变量导致的,解决办法 (1).尽量写成局部变量,函数尽量传参进入. (2 ...

  9. Codeforces Round #668 (Div. 2)【ABCD】

    比赛链接:https://codeforces.com/contest/1405 A. Permutation Forgery 题意 给出一个大小为 $n$ 的排列 $p$,定义 \begin{equ ...

  10. zjnu1735BOB (单调队列,单调栈)

    Description Little Bob is a famous builder. He bought land and wants to build a house. Unfortunately ...