資源簡介
windows 中沒有提供給我們可用的netstat -an 的源碼,本人利用C++的函數實現了這一功能……
代碼片段和文件信息
#define?WIN32_LEAN_AND_MEAN
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#pragma?comment(lib?“Iphlpapi.lib“)
#pragma?comment(lib?“ws2_32.lib“)
static?char?TcpState[][32]?=?
{
“???“
“CLOSED“
“LISTENING“
“SYN_SENT“
“SEN_RECEIVED“
“ESTABLISHED“
“FIN_WAIT“
“FIN_WAIT2“
“CLOSE_WAIT“
“CLOSING“
“LAST_ACK“
“TIME_WAIT“
};
DWORD?EnumTCPTable()
{
PMIB_TCPTABLE?pTcpTable?=?NULL;
DWORD?dwSize?=?0;
DWORD?dwRetVal?=?ERROR_SUCCESS;
struct???in_addr?rip;
struct???in_addr?lip;
char??szrip[32]?=?{0};
char??szlip[32]?=?{0};
//獲得pTcpTable所需要的真實長度dwSize
if?(GetTcpTable(pTcpTable?&dwSize?TRUE)?==?ERROR_INSUFFICIENT_BUFFER)
{
pTcpTable?=?(MIB_TCPTABLE*)?malloc?((UINT)?dwSize);
}
else
return?dwRetVal;
printf(“Active?Connections\n\n“);
printf(“??Proto\t%-24s%-24s%s\n““Local?Address““Foreign?Address““State“);
if?((dwRetVal?=?GetTcpTable(pTcpTable?&dwSize?TRUE))?==?NO_ERROR)?
{
for?(int?i?=?0;?i?(int)?pTcpTable->dwNumEntries;?i++)?
{
rip.S_un.S_addr?=?pTcpTable->table[i].dwRemoteAddr;
lip.S_un.S_addr?=?pTcpTable->table[i].dwLocalAddr;
//監聽端口,遠程主機端口為0,但函數返回是有值的,不知道它是怎么考慮的
if?(pTcpTable->table[i].dwState?==?MIB_TCP_STATE_LISTEN)???
pTcpTable->table[i].dwRemotePort?=?0;
//dwLocalPort,dwRemotePort?是網絡字節
_snprintf(szlipsizeof(szlip)“%s:%d“inet_ntoa(lip)htons((u_short)pTcpTable->table[i].dwLocalPort));
_snprintf(szripsizeof(szrip)“%s:%d“inet_ntoa(rip)htons((u_short)pTcpTable->table[i].dwRemotePort));
printf(“??TCP\t%-24s%-24s%s\n“szlipszripTcpState[pTcpTable->table[i].dwState]);
}
}
else
{
printf(“\tCall?to?GetTcpTable?failed.\n“);
LPVOID?lpMsgBuf;
if?(FormatMessage(?
FORMAT_MESSAGE_ALLOCATE_BUFFER?|?
FORMAT_MESSAGE_FROM_SYSTEM?|?
FORMAT_MESSAGE_IGNORE_INSERTS
NULL
dwRetVal
MAKELANGID(LANG_NEUTRAL?SUBLANG_DEFAULT)?//?Default?language
(LPTSTR)?&lpMsgBuf
0
NULL?))
{
printf(“\tError:?%s“?lpMsgBuf);
}
LocalFree(?lpMsgBuf?);
}
GlobalFree(pTcpTable);
return?dwRetVal;
}
DWORD?EnumUDPTable()
{
PMIB_UDPTABLE?pUdpTable?=?NULL;
DWORD?dwSize?=?0;
DWORD?dwRetVal?=?ERROR_SUCCESS;
// struct???in_addr?rip;
struct???in_addr?lip;
// char??szrip[32]?=?{0};
char??szlip[32]?=?{0};
//獲得pUdpTable所需要的真實長度dwSize
if?(GetUdpTable(pUdpTable?&dwSize?TRUE)?==?ERROR_INSU
評論
共有 條評論