代码实现查看网络连接状态 协议 与端口 并且能看到其进程路径

功能:
能看到当前所有的网络连接状态 协议 与端口 并且能看到其进程路径
windows 未公开的 API实现的

#include <windows.h>
#include <Tlhelp32.h>
#include <winsock.h>
#include <stdio.h>
#include "YouHua.h"
#pragma comment(lib, "ws2_32.lib")

//-------------------------------------------------------
//TCP相关结构体
typedef struct _MIB_TCPEXROW
{
DWORD dwState; //连接状态
DWORD dwLocalAddr; //当前计算机IP地址
DWORD dwLocalPort; //当前计算机端口
DWORD dwRemoteAddr; //远程计算机IP地址
DWORD dwRemotePort; //远程计算机端口
DWORD dwProcessPID; //当前进程PID
}MIB_TCPEXROW,*PMIB_TCPEXROW;

typedef struct _MIB_TCPEXPTABLE
{
DWORD dwNumEntries;
MIB_TCPEXROW table[100];
}MIB_TCPEXTABLE,*PMIB_TCPEXTABLE;


//----------------------------------------------------

//----------------------------------------------------
//UDP相关结构体
typedef struct _MIB_UDPEXROW
{
DWORD dwLocalAddr; //本地计算机IP地址
DWORD dwLocalPort; //本地计算机端口
DWORD dwProcessPId; //当前进程PID
}MIB_UDPEXROW,*PMIB_UDPEXROW;

typedef struct _MIB_UDPEXTABLE
{
DWORD dwNumEntries;
MIB_UDPEXROW table[100];
}MIB_UDPEXTABLE,*PMIB_UDPEXTABLE;
//----------------------------------------------------


//所用的AllocateAndGetTcpExTableFromStack 原形
typedef DWORD(WINAPI *_AllocateAndGetTcpExtableFromStack)
(
PMIB_TCPEXTABLE *pTcpTable,
BOOL bOrder,
HANDLE heap,
DWORD zero,
DWORD flags
);

typedef DWORD (WINAPI *_AllocateAndGetUdpExtableFromStack)
(
PMIB_UDPEXTABLE *pUdpTable, // 连接表缓冲区.
BOOL bOrder,
HANDLE heap,
DWORD zero,
DWORD flags
);


static _AllocateAndGetTcpExtableFromStack pAllocateAndGetTcpExtableFromStack=NULL;
static _AllocateAndGetUdpExtableFromStack pAllocateAndGetUdpExtableFromStack=NULL;

//TCP 端口状态.
static char TcpState[][32] =
{
TEXT("???"),
TEXT("CLOSED"),
TEXT("LISTENING"),
TEXT("SYN_SENT"),
TEXT("SYN_RCVD"),
TEXT("ESTABLISHED"),
TEXT("FIN_WAIT1"),
TEXT("FIN_WAIT2"),
TEXT("CLOSE_WAIT"),
TEXT("CLOSING"),
TEXT("LAST_ACK"),
TEXT("TIME_WAIT"),
TEXT("DELETE_TCB")
};

// 生成IP地址字符串.
PCHAR GetIP(unsigned int ipaddr)
{
static char pIP[20];
unsigned int nipaddr = htonl(ipaddr);
sprintf(pIP, "%d.%d.%d.%d",
(nipaddr >>24) &0xFF,
(nipaddr>>16) &0xFF,
(nipaddr>>8) &0xFF,
(nipaddr)&0xFF);
return pIP;
}

// 由进PID获得全程文件名
char* ProcessPidToName(DWORD ProcessPId)
{
HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
PROCESSENTRY32 processEntry = { 0 };
processEntry.dwSize = sizeof(PROCESSENTRY32);
static char ProcessName[256];

lstrcpy(ProcessName, "Idle");
if (hProcessSnap == INVALID_HANDLE_VALUE)
return ProcessName;

BOOL bRet=Process32First(hProcessSnap, &processEntry);

while(Process32Next(hProcessSnap, &processEntry))
{
if (processEntry.th32ProcessID == ProcessPId)
{
MODULEENTRY32 me32 = {0};
me32.dwSize = sizeof(MODULEENTRY32);
HANDLE hModuleSnap = CreateToolhelp32Snapshot
(TH32CS_SNAPMODULE, processEntry.th32ProcessID);

Module32First(hModuleSnap, &me32); // 获得进程全路径.
lstrcpy(ProcessName, me32.szExePath);
CloseHandle(hProcessSnap);
return ProcessName;
}


}

CloseHandle(hProcessSnap);
return ProcessName;
}


// 显示我们要的信息
void DisplayPort()
{
DWORD i;
PMIB_TCPEXTABLE TCPExTable;
PMIB_UDPEXTABLE UDPExTable;
char chLocalAddress[256];
char chRemoteAddress[256];
if(pAllocateAndGetTcpExtableFromStack(
&TCPExTable, TRUE, GetProcessHeap(), 2, 2))
{
printf("AllocateAndGetTcpExTableFromStack Error!\n");
return;
}

if(pAllocateAndGetUdpExtableFromStack
(&UDPExTable, TRUE, GetProcessHeap(), 2, 2 ))
{
printf("AllocateAndGetUdpExTableFromStack Error!.\n");
return;
}
printf("%-6s%-22s%-22s%-11s%s\n",
TEXT("协议"),
TEXT("本地的连接"),
TEXT("远程的连接"),
TEXT("状态"),
TEXT("相对进程路径"));


for( i = 0; i < TCPExTable->dwNumEntries; i++ )
{
sprintf(chLocalAddress, "%s:%d",
GetIP(TCPExTable->table[i].dwLocalAddr),
htons((WORD)TCPExTable->table[i].dwLocalPort));

sprintf(chRemoteAddress, "%s:%d",
GetIP(TCPExTable->table[i].dwRemoteAddr),
htons((WORD)TCPExTable->table[i].dwRemotePort));

printf("%-6s%-22s%-22s%-11s%s:%d\n\n",TEXT("TCP"),
chLocalAddress,chRemoteAddress,
TcpState[TCPExTable->table[i].dwState],
ProcessPidToName(TCPExTable->table[i].dwProcessPID),
TCPExTable->table[i].dwProcessPID);
}
for( i = 0; i < UDPExTable->dwNumEntries; i++ )
{
sprintf(chLocalAddress, "%s:%d",
GetIP(UDPExTable->table[i].dwLocalAddr),
htons((WORD)UDPExTable->table[i].dwLocalPort));

sprintf(chRemoteAddress, "%s","*:*");

printf("%-6s%-22s%-33s%s:%d\n\n", TEXT("UDP"),
chLocalAddress,chRemoteAddress,
ProcessPidToName(UDPExTable->table[i].dwProcessPId),
UDPExTable->table[i].dwProcessPId);
}
}

int main()
{
WSADATA WSAData;
if( WSAStartup(MAKEWORD(1, 1), &WSAData ))
{
printf("WSAStartup error!\n");
return -1;
}
HMODULE hIpDLL = LoadLibrary( "iphlpapi.dll");
if (!hIpDLL)
return -1;

pAllocateAndGetTcpExtableFromStack =
(_AllocateAndGetTcpExtableFromStack)GetProcAddress(hIpDLL,"AllocateAndGetTcpExTableFromStack");
pAllocateAndGetUdpExtableFromStack =
(_AllocateAndGetUdpExtableFromStack)GetProcAddress(hIpDLL,"AllocateAndGetUdpExTableFromStack");

DisplayPort();
FreeLibrary(hIpDLL);
WSACleanup();

Sleep(50000); //防止一输出就结束 getchar 也可以
return 1;
}

转载于:https://www.cnblogs.com/waityou/archive/2011/11/29/2268415.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值