首页 服务器 编程 必备知识 搜索引擎 圩日手册
站内搜索
最近浏览
推荐文章
热文排行

VC中枚举tcp连接,册除tcp连接


#pragma once
#include "Iphlpapi.h"
#include <malloc.h>
#include <stdlib.h>
#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"
};
static DWORD EnumTCPTable(vector<MIB_TCPROW> &TcpConnectInfo)
{
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*) GlobalAlloc(GMEM_FIXED, (UINT) dwSize);
}
else
{
        return dwRetVal;
}


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;
   
    TcpConnectInfo.push_back(pTcpTable->table[i]);
   }
}
else
{
   char szError[100] ={0};
   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 ))
   {
    _snprintf(szError,sizeof(szError) -1,"\tError: %s", lpMsgBuf);
    OutputDebugString(szError);
   }
   LocalFree( lpMsgBuf );
}

GlobalFree(pTcpTable);
return dwRetVal;
}


static BOOL KillTCPConnect(DWORD dwRemoteAddr,DWORD dwRemotePort)
{
vector<MIB_TCPROW> VCTcpConnectInfo;
EnumTCPTable(VCTcpConnectInfo);

vector<MIB_TCPROW>::iterator itTcp = VCTcpConnectInfo.begin();
for (;itTcp!=VCTcpConnectInfo.end();itTcp++)
{
   if ((dwRemoteAddr == itTcp->dwRemoteAddr)&&(dwRemotePort == itTcp->dwRemotePort))
   {
    MIB_TCPROW mibRow ={0};
    mibRow = *itTcp;
    mibRow.dwState = MIB_TCP_STATE_DELETE_TCB;//一定要记得设置
    DWORD dwResult = SetTcpEntry(&mibRow);
    if(dwResult == NO_ERROR)return TRUE;
    else return FALSE;
   }
}

return FALSE;
}

[wangjy17908]
添加时间:2010-06-28
版权所有(C)2005-2015