Chinaunix首页 | 论坛 | 博客
  • 博客访问: 626070
  • 博文数量: 127
  • 博客积分: 6136
  • 博客等级: 准将
  • 技术积分: 1461
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-24 00:32

分类: C/C++

2010-11-22 17:10:56

    今天早上刚到实验室,就被老板叫了过去,要让我实现一个获取主机tcp连接的小程序,程序输出的内容就是进程名称,开放端口信息,远程ip和端口,并要定期扫描,输出,程序要能够在xp、vista、win7上都能运行。老板说完,我甚是高兴,因为,在此之前,就打算写一个流量监控的小工具,一直没有动手,正好趁着这次机会,将流量监控的程序开发出来。
    要实现主机的tcp连接信息,就要用到微软未公开的一个函数AllocateAndGetTcpExTableFromStack,这个函数实现在iphlpapi.dll,网上这方面的资料很多,这里不作详细介绍,看实现代码吧:

    HMODULE hModule;
    hModule = LoadLibrary(_T("iphlpapi.dll"));
    if (hModule == NULL)
        return;
    // XP and later
    lpfnAllocateAndGetTcpExTableFromStack = (PROCALLOCATEANDGETTCPEXTABLEFROMSTACK)GetProcAddress(hModule,"AllocateAndGetTcpExTableFromStack");
    if (lpfnAllocateAndGetTcpExTableFromStack != NULL)
    {
        dwLastError = lpfnAllocateAndGetTcpExTableFromStack(&lpBuffer,TRUE,GetProcessHeap(),0,2);
        for (dwSize = 0; dwSize < lpBuffer->dwNumEntries; dwSize++)
        {

           ..............

           //这里对每一个tcp连接做相应处理

            HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,FALSE,lpBuffer->table[dwSize].dwProcessId);
            GetModuleBaseName(hProcess,NULL,proname,MAX_PATH);//根据pid获得进程名称
            wcstombs( pname, proname, 50 );
            ..........
        }
    }

以上只是xp版本的,在vista和win7下,在获取AllocateAndGetTcpExTableFromStack时就会出错。这里要用到iphlpapi.dll中的另外一个函数:InternalGetTcpTable2。详细实现如下:

     //for vista and win 7
    {
        PMIB_TCPEXTABLE_VISTA pTcpTable_Vista;
        _InternalGetTcpTable2 pGetTcpTable = (_InternalGetTcpTable2)GetProcAddress(hModule,"InternalGetTcpTable2");
        if (pGetTcpTable == NULL)
            return;

        if (pGetTcpTable(&pTcpTable_Vista,GetProcessHeap(),1))
            return;

        for (UINT i=0;i<pTcpTable_Vista->dwNumEntries;i++)
        {
           
..............
           //这里对每一个tcp连接做相应处理

            //获取程序名称
            HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,FALSE,pTcpTable_Vista->table[i].dwProcessId);
            GetModuleBaseName(hProcess,NULL,proname,MAX_PATH);
           ....................
        }

我们可以将这两个版本合并到一个程序中去,这样编译出的程序就是windows平台无关了,下面是程序源代码,我只将核心的部分保留,其他的代码都删了。
文件:tcp_monitor.rar
大小:2KB
下载:下载
阅读(4531) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2011-05-26 16:50:41

你好 请问可不可以把源码传我学习哈呢 670914919@qq.com 课程设计急需 谢谢了!